May the Neural Networks be with you

ニューラルネットワークと共にあらんことを

深層学習モデルの実装を爆速にするVSCodeの設定メモ

こんにちは。@shunk031です。 新型コロナウイルスが猛威を奮っていますね。 不要不急の外出は控えるのが大切そうです。 こういう時は引きこもって論文を読むのが一番です。

今回はコードエディタであるVSCodeで、深層学習モデルの実装を爆速にするための設定についてメモします。 深層学習モデルの実装をする際にはリモート上にあるGPUを搭載したサーバで実装をしたりデバッグすることが非常に多いです。 VSCodeはこうしたリモートでのコード編集およびデバッグを簡単に行える仕組みを多数揃えています。

本記事では、深層学習モデルの実装に頻繁に利用されるPythonを対象に、以下の観点からモデルの実装を爆速にする設定や機能について紹介します:

  • Pythonの開発環境の構築
  • リモートのGPUサーバに接続するための設定
  • 深層学習モデルの実装・デバッグを簡単にする機能
  • おすすめのショートカットキー・拡張機能・カスタマイズ

私自身これまで魔改造したEmacsに引きこもってコードを書いてきましたが、以下の本でVSCodeに入門することができました。 体系的に整理されており、他のエディタから乗り換えを検討している方にオススメできる内容です。

Visual Studio Code実践ガイド —— 最新コードエディタを使い倒すテクニック

Visual Studio Code実践ガイド —— 最新コードエディタを使い倒すテクニック

  • 作者:森下 篤
  • 発売日: 2020/02/21
  • メディア: 単行本(ソフトカバー)

VSCodeのインストール

WindowsMacOSともに公式サイトからダウンロード可能です。

code.visualstudio.com

MacOSにおいて brew がインストールされている場合、以下のコマンドでインストールが可能です:

$ brew cask install visual-studio-code

コマンドパレットによるコマンドの実行

以降、簡単のためVSCodeコマンドパレットWindows: alt + shift + p , MacOS: cmd + shift + p)からコマンドを実行します。 コマンドパレットやショートカットキーに慣れるとキーボードから手を離すことなく編集が可能になります。 テキスト編集の効率化のために慣れることをおすすめします。

settings.json によるVSCodeの設定

VSCodeGUIによる設定のほか、 settings.json による設定の記述が可能です。 コマンドパレットから > Preferences: Open Settings (JSON) で設定ファイルを開くことができます。 以降では私がおすすめする設定をこの settings.json の形式で紹介します。 最終的な全体の設定は後半のセクションに示します。

Pythonの開発環境の構築

VSCodeによるPythonの開発環境はPython拡張機能をインストールすることで殆ど設定不要でリッチな補完やリファクタリング機能が使用できます。

拡張機能のインストール

Pythonの開発環境のための拡張機能をインストールします。 コマンドパレットから > View: Show Extensions を選択して検索窓から python と入力することで、以下の拡張機能を見つけることができますので、インストールしてください。

marketplace.visualstudio.com

settings.json の設定例

以下にPython拡張機能に対するsettings.jsonの設定例を示します:

{
    "python.formatting.provider": "black",
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--ignore=E501,W503"
    ],
    "python.sortImports.args": [
        "-m 3"
    ],
    "python.jediEnabled": false
}
  • black : Formatter
    • blackによるソースコードの自動フォーマットを利用します。カスタマイズ不要で規約に沿ったフォーマットに整えてくれます。
  • flake8 : Linter
    • flake8による文法チェックを利用します。
    • blackと併用する際に E501 (一行が長すぎるとエラー) *1W503 (二項演算子の前に改行すると警告) *2 を無視する設定を追加します。
    • pylintはflake8と同様に文法チェッカーとして広く用いられていますが、今回紹介する設定例ではflake8を用いるため、offにします。
  • isort : import文のソート
    • isortによるimport文の自動整理を利用します。
    • import文を改行する際のスタイルを -m 3 のように指定します。
  • jedi : コード補完
    • jediはこれまで広くPythonのコード補完に用いられてきましたが、Microsoft製のコード補完がよりリッチに動作するため、今回紹介する設定例ではoffにします。

これらのパッケージは対象のPython環境にインストールされていない場合はインストールを促すポップアップが表示されます。指示に従うことで簡単にインストールが可能です。

Python環境の指定

pyenv 等を用いた仮想のPython環境が存在する場合、コマンドパレットから> Python: Select Interpreter を選択し、Python環境の切り替えが可能です。 対象の仮想環境を選択して切り替えを行ってください。

リモートGPUサーバに接続するための設定方法

VSCodeではRemote developmentの拡張機能をインストールすることにより、ローカルでテキスト編集しているのとほとんど同様の編集が可能になります。

拡張機能のインストール

リモートのサーバ上のテキストを編集するために拡張機能をインストールします。 コマンドパレットから > View: Show Extensions を選択して検索窓から remote と入力することで、以下の拡張機能を見つけることができますので、インストールしてください。

marketplace.visualstudio.com

リモートのサーバにVSCodeで接続

コマンドパレットから > Remote-SSH: Open configuration File を選択すると、sshの設定ファイルが開きます。こちらに接続先となるサーバの情報を以下のように記入しておきます:

Host <任意の名前>
    Hostname <サーバのIPアドレス>
    User <ログインしたいサーバ上のユーザ名>
    IdentityFile <ssh鍵の場所>

サーバに接続するには、コマンドパレットから > Remote-SSH: Connect to Host を選択すると、<任意の名前> として設定したサーバ名が選択肢に現れるので選択します。 そうすると新しいウィンドウが立ち上がり、サーバに接続された状態のVSCode画面が現れます。

リモートのサーバに拡張機能をインストール

これまで複数の拡張機能をインストールしてきました。 VSCodeでは、リモートのサーバにも同様の拡張機能をインストールする必要があることに注意してください。

予めインストールすることが決まっているPython拡張機能などは、以下のようにsettings.jsonに記述することによって自動でインストールすることができます:

{
   "remote.containers.defaultExtensions": [
        "ms-python.python",
        "christian-kohler.path-intellisense"
    ]
}

深層学習モデルの実装・デバッグを簡単にする機能

深層学習モデルの実装を行う上で一番時間がかかるのは「モデルの入出力をする部分」と「モデル内のテンソル形状を合わせる部分」だと思います。もうここらへんもエーアイでなんとかしたいですが、そう簡単にはいきません。VSCodeデバッグ機能はこうした微妙の修正を必要とする部分で力を発揮します。

VSCodeの強力なデバッグ機能

深層学習モデルの実装で度々用いられるPyTorchによる実装をデバッグしている様子が以下のツイートで取り上げられています。

VSCodeではPython拡張機能をインストールしただけで次のようなことが可能です:

  • テンソルの値や形状が自動的に表示される(左画面)
  • マウスカーソルを変数に合わせるだけでテンソルの値や形状、重みやデバイスタイプまで確認できる

このように、深層学習モデルのデバッグに必要不可欠な情報が簡単に確認可能です。 一般的にデバッグをする際にはpdbといったデバッガを使用したり、printデバッグ を駆使していると思いますが、マウスホバーのみでテンソルの値や形状を確認することができ、こうした労力がほぼ0になります。

Pythonスクリプトデバッグ

VSCodeによるデバッグの流れとして、デバッグの設定を記述した launch.json を作成します。 launch.jsonの設定例として、以下のサイトに各プログラミング言語の例が掲載されています。 74th.github.io

今回は特にPythonを対象としているので、以下のページを見て設定します。

74th.github.io

具体的なデバッグの詳細については割愛します。公式サイトのページが特に詳しく紹介されているので参考にしてください。

code.visualstudio.com

AllenNLPモデルのデバッグ

深層学習による自然言語処理モデルを実装する際、AllenNLPを用いる方も多いのではないでしょうか? VSCodeデバッグ機能を用いてAllenNLPで実装したモデルをデバッグするには以下のサイトが参考になります。

docs.allennlp.org

デバッグ時に呼び出すスクリプトを記述します。 あとは launch.json に同様の手順でデバッグの設定を記述するだけのみです。

余談

ここからは私自身がおすすめするVSCodeの各種設定について述べます。

おすすめのショートカットキー・拡張機能・カスタマイズ

おすすめのショートカットキー

テキスト編集を効率よくできるショートカットキーとして私が多用しているものを列挙します。 以下はMacOSを想定したショートカットキー記述ですが、Windowsの場合は cmdalt に読み替えてください。

  • コマンドパレットを開く
    • 最重要ショートカットです。本記事でも何度も登場しました。
    • cmd + shift + p
  • サイドバーを開閉する
    • 左にあるサイドバーを表示したり隠したりします。エディタ領域が狭くなるので隠します。
    • cmd + b
  • ファイルエクスプローラを開く
    • ファイル一覧を見るのに使います。
    • cmd + shift + e
  • マルチカーソル系
    • 複数カーソルを表示して変数等を編集するときに使います
      • すべて変更する系
        • 選択中の語句をすべて選択する
          • cmd + shift + l
      • 特定の語句のみを対象として変更する系
        • cmd + d

おすすめの拡張機能

おすすめのカスタマイズ

このセクションでは、これまでに登場してきたおすすめ設定の全体を示します。 これらの設定の反映はコマンドパレットから > Preferences: Open Settings (JSON)settings.json を開いてコピペすることで反映されます。

{
    "editor.cursorStyle": "block",
    "editor.formatOnSave": true,
    "editor.minimap.enabled": false,
    "editor.formatOnType": true,
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    },
    "files.watcherExclude": {
        "**/.git/objects/**": true,
        "**/.git/subtree-cache/**": true,
        "**/node_modules/**": true,
        "**/dataset/**/*.{png,zip,jpg,npz}": true,
    },
    "remote.containers.defaultExtensions": [
        "christian-kohler.path-intellisense",
        "davidhouchin.whitespace-plus",
        "JoeBerria.statusbarerror",
        "ms-python.python",
        "streetsidesoftware.code-spell-checker"
    ],
    "python.formatting.provider": "black",
    "python.linting.flake8Enabled": true,
    "python.linting.pylintEnabled": false,
    "python.jediEnabled": false,
    "python.linting.flake8Args": [
        "--ignore=E501,W503"
    ],
    "python.sortImports.args": [
        "-m 3"
    ],
    "statusbarerror.wholeLine.show": true,
    "window.zoomLevel": 0,
    "window.title": "${folderPath}${separator}${activeEditorShort}${separator}${rootName}",
    "workbench.colorTheme": "Solarized Dark+",
    "workbench.startupEditor": "newUntitledFile",
    "workbench.colorCustomizations": {
        "editorCursor.foreground": "#FFFF00"
    },
    "cSpell.userWords": [
        "conv",
        "cuda",
        "cudnn",
        "lstm",
        "ndarray",
        "numpy",
        "relu",
        "sklearn",
        "tqdm",
    ],
}

以下はこれまで紹介してこなかった設定についてコメントをいれます:

  • "editor.formatOnSave": true
    • ファイルを保存するときにフォーマッタを実行します。特にPythonのフォーマッタであるblackにより、常にコード規約に従った整ったコードを維持できます。
  • "editor.codeActionsOnSave"
    • "source.organizeImports": true
      • ファイルを保存するときにimport文を整理します。特にPythonのisortによって、import文が常に整理された形で維持できます。
  • "editor.minimap.enabled": false
    • ミニマップの表示をoffにします。これいります?
  • "files.watcherExclude"
    • 変更監視を除外するパターンを定義します。深層学習ではたくさんのファイルを扱うため、特に .jpg.png といった画像ファイルや .csv.csv といったテキストファイルを予め除外しておくことをおすすめします。
    • ディレクトリ構造に合わせて適宜変更することをおすすめします。
  • "cSpell.userWords"
    • スペルチェック時に除外する単語群を定義します。

Emacsから乗り換え

私はこれまでEmacsディストリビューションの1つであるSpacemacsを使っていました. 本記事を執筆するにあたり、これまで使ってきたEmacsの操作感にできるだけ近くなるようにいくつか設定しました。以下に詳細を紹介します。

代替となるVSCodeの機能や拡張機能

M-x から始まるコマンド実行

  • コマンドパレット
    • Emacsでは M-x から始まるコマンドが数え切れないほどあります。VSCodeのコマンドパレットはEmacsM-xと同様の立ち位置でして、本記事でもコマンド実行の際に様々な場面で登場してきました。

Emacsキーバインド

カラースキーマ

代替となるショートカットキー

これまで愛用してきたEmacsの操作感に近づけるためにキーバインドの追加や変更は必須です。 キーバインドの変更はコマンドパレットから > Preferences: Open Keyboard Shortcuts (JSON) を選択することで、keybindings.json が開きますので、こちらを追加していきます。 私は現在、以下のキーバインドを定義して使用しています:

[
    {
        "key": "ctrl+i",
        "command": "editor.action.indentLines",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "cmd+.",
        "command": "editor.action.revealDefinition",
        "when": "editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor"
    },
    {
        "key": "cmd+,",
        "command": "workbench.action.navigateBack"
    },
    {
        "key": "ctrl+x p",
        "command": "workbench.action.navigateBack"
    },
    {
        "key": "ctrl+x m",
        "command": "workbench.view.scm"
    },
    {
        "key": "ctrl+c ;",
        "command": "editor.action.commentLine",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "cmd+w",
        "command": "-workbench.action.closeWindow",
    },
    {
        "key": "cmd+w",
        "command": "-workbench.action.closeActiveEditor"
    },
    {
        "key": "cmd+w",
        "command": "-workbench.action.closeGroup",
    },
    {
        "key": "cmd+w",
        "command": "emacs-mcx.copyRegion",
        "when": "editorTextFocus"
    }
]

Emacsでは分割した画面を移動する際に C-x o (Ctrl + x o) を頻繁に利用しますが、この逆の操作 C-x p のようなもの*3VSCodeおよび追加したEmacsキーバインドの拡張にはありませんでした。 そこで次のような設定を定義することで操作を追加します:

{
    {
        "key": "ctrl+x p",
        "command": "workbench.action.navigateBack"
    }
}

代替できなかったEmacsの機能や拡張機能

VSCodeを使ってきて、EmacsにあってVSCodeに無くクリティカルに重要であった機能は今の所私のユースケースではなさそうです。しかしながらEmacs Lispには便利な拡張がたくさんあり、以下にいくつか紹介したいと思います。代替できそうな拡張機能をご存知ある方はぜひ @shunk031 までお知らせください。

dotfilesとして設定を管理する

これまでたくさんの拡張機能の導入や、それに伴った settings.jsonkeybindings.json の設定を行ってきました。 これらをGitHub等で管理することで、違うデバイスでも同じ環境でコードを書くことが可能です。

私はもともとGitHub上でdotfiles*4を管理しているため、VSCodeの設定ファイルもdotfilesに含めて管理しようと考えました。

github.com

具体的には、dotfilesディレクトリ内の settings.json および keybinding.json からもともとあった設定ファイルの場所にシンボリックリンクを張ります:

$ ln -sf ~/.dotfiles/.vscode.d/settings.json ~/Library/Application\ Support/Code/User/
$ ln -sf ~/.dotfiles/.vscode.d/keybindings.json ~/Library/Application\ Support/Code/User/

こうすることでGitHubで設定ファイルを管理する体制ができるわけですが、最新版ではVSCodeが設定ファイルの同期をサポートし始めました。

forest.watch.impress.co.jp

お好きな方法で設定ファイルを管理することをおすすめします。

おわりに

本記事では、深層学習モデルの実装に頻繁に利用されるPythonを対象に、深層学習モデルの実装を爆速にする設定や機能について紹介しました。 リモートにあるGPUサーバに簡単に接続が可能であり、またリモート上のコードの編集やデバッグが容易であることを確認しました。これらの機能をフル活用することにより、今まで以上に深層学習モデルの実装が高速に行える可能性があると考えています。

また、Emacsから乗り換えを検討している方たちに向けて、代替可能な拡張機能やショートカットキーを示し、代替ができていない拡張機能についても示しました。これらの拡張機能は自身で作ることが可能なので、少しずつ穴を埋められるような拡張機能を作れたらよいなと考えています。

参考記事

Windows向け

phst.hateblo.jp

*1:PEP 501 -- General purpose string interpolation | Python.org https://www.python.org/dev/peps/pep-0501/

*2:PEP 503 -- Simple Repository API | Python.org https://www.python.org/dev/peps/pep-0503/

*3:EmacsでC-x oの逆動作をC-x pに割り当てる - 拡張現実ライフ

*4:. (ドット) から始まる設定ファイルのことです。.bashrc や .zshrc 、tmux.conf 、.vimrc などを指します。

2019年の振り返り

こんにちは。@shunk031です。クリスマスにニューラルネットワーク"力"をお願いしましたが、何も貰えませんでした。サンタさんはHinton先生ではないみたいです。毎年同じお願いをしている気がします。

f:id:shunk031:20191231202921j:plain
メイドさんに書いてもらった「論文採択」です

驚くべきことに2019年も今日で終わりみたいです。 この1年何をやってきたか振り返りも兼ねて、思い出せるイベントについてその時のツイートと共に残しておこうと思います。

自己紹介

法政大学理工学研究科応用情報工学専攻2年です。深層学習を主とした自然言語処理を研究しています。Gunosyで研究にフォーカスしたリサーチインターンをやっています。

1月

1月は主に1月中に締め切りがある国内学会用の論文2本と、2月頭に締め切りがある国際学会用の論文1本を書くハードスケジュールをこなしていました。これらは自然言語処理医用画像処理、そして計算機広告というそれぞれ異分野の論文を並行で執筆していました。その途中に逆求人イベントや機械学習のコンペに参加していたりと、2019年始まった最初の月が今年で一番大変だった月だったと記憶しています。

情報処理学会 論文締め切り

1月11日締切の情報処理学会全国大会用の論文を書いていました。こちらは以前書いたSkin lesion classification with ensemble of squeeze-and-excitation networks and semi-supervised learningという論文の追加実験を行った結果をメインに執筆を行なっていました。

www.ipsj.or.jp

言語処理学会 論文締め切り

1月16日締切の言語処理学会全国大会用の論文を書いていました。こちらはGunosyでのリサーチインターンの成果をメインに執筆を行なっていました。

www.anlp.jp

アカリクITイベント in 東京

2020年卒だったので、一応就活を意識していました。まずは自分の現在持っている技術や経験がどれくらい企業の方に評価していただけるのかを知るために、以下の逆求人イベントに参加しました。

acaric.jp

参加されている方々は素晴らしい実績を持っている方々ばかりだったようで、Twitter等でもよくお見かけする方々とも交流できたのでとても良い経験になりました。

この逆求人イベントで声を掛けていただいた企業様を中心に就活を進めたので、とても有意義だったと考えています。

DeNAデータ解析コンペイベント

もともと交流があり、Kaggler軍団を有するDeNAさんが機械学習コンペをやるということで、怖いもの知らずでしたが参加してきました。

dena-ai.connpass.com

イベント開催中のPublic LBがあまり芳しくなく、ぜんぜんスコア上がらないと落ち込んでいたのですが、なぜかPrivate LBで1位でした。優勝者として名前が呼ばれたことにとても驚いたことを覚えています。

2月

2月はKDDの締め切りがあったあと少しゆっくりしていました。その間にChainerハンズオンのチューターに参加したり、機械学習のコンペを後輩たちと一緒にチームを組んでやっていたりしました。

KDD 論文締め切り

2月3日締切のKDD2019用の論文を書いていました。初めてのロングペーパーで、初めてのACMフォーマットで9ページ書ききるのがとても辛かったです。データマイニングのトップカンファレンスで採択率も低いこともあり、このときはKDDに採択されると思っておらず、リジェクトされたらCIKM2019に再度提出してみようという戦略でした。

www.kdd.org

Chainer Beginner's Hands-on Course チューター参加

突然ですが私はChainerが大好きです。研究でも使っていましたし、再現実装等もそれなりに多く公開してきました。しかしこれまでChainer本体に何もコントリビュートできていませんでした。 ちょうどChainerのハンズオンが開催されるタイミングがあり、そこでチューターとして参加させていただきました。

chainer.connpass.com

コードでコントリビュートしろと言われればそれまでですが、実際使っている方や使っている中で困っている方を助けることが出来たと考えており、コミュニティに対してコントリビュートできたのかな、と当時思っていました*1

FDC締め切り

忙しかった1月の中旬頃から、こちらも機械学習コンペであるFintech Data Championship (FDC) に参加していました。こちらは株価を予測するコンペであり初手で闇コンペみを感じていましたが、コンペ運営も少しガバめであったこともあり闇x闇という素晴らしいコンペでした。

prtimes.jp

AIを専攻していないので分かりませんが、何かのバグを踏んでしまい3000億稼ぐエーアイを爆誕させて大喜びしていたのを覚えています。

3月

3月、それとなく就活ムーブをしてみたり、学会をはしごして発表したりしていました。移動距離が結構長くて移動している感を感じました。

就活

何の苦しみもなく就活をしていた気がします。応募するときも人事の方がいい感じにやってくれていたり、面接に行くとだいたいお知り合いだったのも気持ちが楽でした。ESは特に書いた記憶がなく、それっぽいCVを送るだけで良かったです。よく聞く就活辛い話は特になく、運の良い学生だったかなと今は思います。

言語処理学会2019 in 名古屋

名古屋大学で開催された言語処理学会2019全国大会にて、以下の発表を行いました。

  • 北田俊輔, 彌冨仁, 関喜史, "広告クリエイティブ自動生成にむけたマルチタスク学習と Conditional Attention による CVR 予測", 言語処理学会第 25 回年次大会, 2019.

言語処理学会での発表の様子は以下のブログに譲ります。

data.gunosy.io

情報処理学会2019 in 福岡

福岡大学で開催された情報処理学会2019全国大会にて、以下の発表を行いました。

  • 北田俊輔, 彌冨仁, "頑健な皮膚腫瘍診断支援のための body hair augmentation", 情報処理学第 81 回会全国大会, 2019.

言語処理学会での発表を終えて次の日には福岡に移動しました。新幹線の中で某社の採用課題をやって提出しました。その時はモデルのチューニングを考えたくなかったのでoptuna*2でハイパラ探索をさせていたのを記憶しています。

ありがたいことに学生奨励賞をいただくこともできました。

大学のホームページに乗ると、実家の家族も驚いてくれるので*3ありがたいです。

www.hosei.ac.jp

Gunosy DM 発表

私のインターン先であるGunosyでは毎週論文読み会を開催しています。私自身も発表に参加させていただいています。ちょうどWSDM2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

卒業式

お世話になった先輩方や、お世話をした後輩たちが卒業していきました。みなさん社会で活躍しているので弊研出身者凄いなという気持ちです。

FDC 結果発表

株価予測は運。

4月

3月に引き続き就活っぽいことをしつつ、推し事をやるために全国を飛び回っていました。 採用インターンでDe社さんにお世話になっており、とても楽しくインターンさせていただきました。

小倉唯ライブ

推し事をやりました。

www.ogurayui.jp

全通しました。大阪、滋賀、愛知、新潟、仙台、幕張2daysを1ヶ月でやりました。

KDD論文採択

4月28日にKDDの論文採択通知が来ました。ちょうどゴールデンウィークで実家に帰省していたのと、あまり期待していなかったため適当な生活をしていたのですが、共著者の関さんから連絡が来てメールを確認したら採択されてました。今でもあの嬉しさは忘れられないです。何も理解がない実家で一人ありえん喜んでいたので、とうとう息子は壊れてしまったのかと心配されました。

論文採択までのいろいろは以下のブログでまとめています。

shunk031.hatenablog.com

5月

5月はKDDに採択された論文のカメラレディを用意したり、プロモーションビデオを用意したりしていました。これが微妙に大変で忙しかったです。

KDD camera ready 締め切り

こちらがcamera ready版の論文です。いい感じに仕上がりました。

https://dl.acm.org/doi/10.1145/3292500.3330789dl.acm.org

研究室運動会

弊研恒例の研究室運動会でした。このときは3年間参加してきた運動会もラストか〜と個人的にエモい感じになっていました。

iyatomi-lab.info

6月

6月は比較的のんびりしていた気がします。ぽつぽつと就活案件も入っていたようです。

Cpaw LTで登壇

所属サークルであるCpawでLTをしました。

cpaw.connpass.com

私はPyTorchのC++フロントエンドであるlibtorchとgolangのwebアプリフレームワークであるginを組み合わせた高速な深層学習APIサーバの構築について話しました*4

実装は以下に公開しています。

github.com

ICML/KDD 2019 Pre-conference sessionで登壇

KDDの採択を受けて、同時期にICMLに採択されたLAPRASさんからお声がけいただき、以下の勉強会で発表してきました。

lapras.connpass.com

クローズドな勉強会で登壇

Gunosy社内で複数社合同のクローズドな勉強会が開催されたときにKDDに採択された内容を発表させていただきました。ちょうどこのときガウス過程と機械学習 の著者の大羽先生の講演も聞くことができ、とても刺激を受けました。

エムスリーインターン

ある勉強会でエムスリーの西場さんのお話を聞く機会があり、かねてより気になっていたのでインターンに応募させていただきました。エムスリー社内で私のことを知ってくださっている方も多く、次に連絡をもらったときにはもうインターンとして採用決定している旨を聞き、スピード感に驚きました。

エムスリーでは主に医療論文のレコメンドサービスをイチから立ち上げる経験をしました。アルゴリズム部分は私自身が選定し、実装しました。インターンが終わった後も私が実装したものをベースに改善されていっているようです*5

speakerdeck.com

ちなみに西場さんの エムスリーにおけるAI・機械学習チームの立ち上げと機械学習プロダクト開発 がとても良かったです。医療論文のレコメンドサービス Pauli についても言及されています。

speakerdeck.com

同時期にご一緒させていただいていたインターン生がありえないぐらい強かったです。

7月

8月頭のKDDへの発表に向けて準備していたり、8月終わりのYANSにむけたネタ集めをしていた時期でした。

Gunosy DM 発表

ちょうどWWW2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

フロリダ大学からの来客

指導教員の友人がフロリダ大学からいらっしゃいました。以下は彼が当時研究していたものです。 \beta-VAEにおける  \beta はチューニングするのが難しいですが、以下ではそうした問題を克服するための手法を提案しています。

arxiv.org

リサーチインターンに対するインタビュー

Gunosyでのリサーチインターンの成果について、メンターである関さんとインタビューを受けました。いつも面倒を見てくださっている関さんからとても嬉しい言葉をいただけたので、ここに引用しておきます。

頭で考えてから実装までのスピードがとても速いです。これはとても重要な能力だと思います。我々が取り組んでいるような機械学習の応用に関する研究ではどれだけ頭で考えていても、実装の結果を見ないと分からないことが多いです。北田君は考察しながら手を動かし、限られた時間で目覚ましい成果を出しているので、素晴らしいと感じています。 あとは、コミュニケーションを容易に取れる所も助かっています。僕が言った内容を理解し、それ以上の情報を返してくれる優秀さに驚いています。研究チームに北田君を誘ったのも、僕がメディアの研究や推薦システムの部分を行い、広告の研究を北田君に一任したいと考えていたからです。実際、広告技術部にいた彼だからこそ得意な分野を活かして良い研究に仕上げられたと感じています。

研究職インターンが活躍する環境とは~論文がトップカンファレンスに採択されるまでの軌跡 - Gunosiru(グノシル) | はたらくを知り、 Gunosyを知る。

gunosiru.gunosy.co.jp

特別賞受賞

リサーチインターンの成果が評価され、Gunosyでの締め会でCEO特別賞をいただくことができました。社員以外での受賞はこれが初めてのようです。たくさんの社員さんに協力して論文を書かせていただいたので、受賞できて嬉しかったです。

gunosiru.gunosy.co.jp

CEO特別賞(多大な業績に貢献した社員のみに贈られる賞) こちらの賞は従来の賞とは別に、多大な業績に貢献した社員が居る場合のみ贈られます。今回は、データマイニングに関する国際会議「KDD2019」に論文が採択された関さんと北田さんの2名が受賞しました。

飛躍に向けた全力助走~『Gunosy 第7期 下半期締会』の様子をレポート - Gunosiru(グノシル) | はたらくを知り、 Gunosyを知る。

8月

8月はKDDでアラスカ、お盆の帰省で長野、YANSで北海道と移動し、比較的涼しいところで過ごした夏でした。1年の中でも特に充実した1ヶ月でした。

KDD2019 in アラスカ

アラスカで開催されたKDD2019にて、以下の発表を行いました。

  • Shunsuke Kitada, Hitoshi Iyatomi, Yoshifumi Seki. "Conversion Prediction Using Multi-task Conditional Attention Networks to Support the Creation of Effective Ad Creatives." Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining, 2019.

初めての本会議で初めてのトップカンファレンスということもあり、学会の規模の大きさに驚きました。ポスター発表では名だたるテック企業の方々がポスター発表を聞きに来てくださり、とても刺激的なディスカッションをすることができました。

Gunosy DM 発表

SIGIR2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

オープンキャンパス

夏といえばオープンキャンパスです。今年は弊研究室が公開されました。私たちが普段研究している内容についての展示や説明を行いました。

iyatomi-lab.info

YANS2019

北海道札幌市で開催されたYANS2019にて、以下の発表を行いました。今回は初めて弊研から複数人参加であり、共著としての発表も増えました。

  • 北田俊輔,彌冨仁, "解釈性向上のための注意機構と損失勾配に対する関連損失の導入",NLP 若手の会 (YANS) 第 14 回シンポジウム, 2019.
  • 長澤駿太,北田俊輔,彌冨仁, "日本語の文字体系を考慮した文書分類モデルの提案",NLP 若手の会 (YANS) 第 14 回シンポジウム, 2019.
  • Daif Mahmoud, Shunsuke Kitada, Hitoshi Iyatomi, "Image Based Character Embeddings for Arabic Document Classification",NLP 若手の会 (YANS) 第 14 回シンポジウム, 2019.

以下はKDD2019でもらったTシャツを来てYANSで発表した様子です。

ありがたいことに奨励賞をいただくことができました。投票していただいたみなさんのおかげで受賞できたので、これを励みにまた頑張ろうという気持ちが強かったです。

繰り返しになりますが、大学のホームページに乗ると、実家の家族も驚いてくれるので*6ありがたいです。

www.hosei.ac.jp

9月

8月は出ずっぱりで発表しまくり月間でしたが、9月も引き続き発表する機会に恵まれました。研究室合宿でゆっくりしたかったですが、ありえん遊んでしまいました。

研究室合宿

毎年恒例弊研の合宿です。B4の子たちの中間発表に向けた発表練習が中心で、その後はいい感じに遊びました。

iyatomi-lab.info

法政大学 科学技術フォーラム

弊学の理系学部の研究・技術の内容・成果を展示などで披露するフォーラムに弊研が選ばれました。弊研究室が行っている研究をポスターにまとめ、来場者の方に説明を行ったり、デモを披露したりしました。

iyatomi-lab.info

PyConJP 2019

PyConJPは私がB3の頃から参加しています。当時はM2の先輩と一緒に参加し、とても楽しかった記憶があります。今年は私がM2で、B3, B4, M1の後輩たちと発表を聞きました。機械学習を中心とした発表が多く、Pythonのカンファレンスではなく機械学習のカンファレンスでは?という感想を抱きました。機械学習のカンファレンスでも私は聞いていて楽しいのでよいですが。

pyconjp.connpass.com

テキストアナリティクスシンポジウム 依頼講演

KDDの採択を受けて、テキストアナリティクスシンポジウムでリサーチインターンはどういうものなのか講演していただきたいというとてもありがたい依頼を受けまして、発表させていただきました。海外では一般的になりつつあるリサーチインターンですが、国内ではまだまだ発展途上であり、私がリサーチインターンをやっていく中でどのように論文採択までに至ったかについて発表しました。パネルディスカッションタイムでは、CyberAgentの方々や共著者でメンターの関さんと白熱したディスカッションができました。

speakerdeck.com

10月

10月はそれなりにゆっくりしていた1ヶ月だった気がします。あまり記憶がないです。

Gunosy DM 発表

KDD2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。この発表は私たちがKDDでポスター発表していたちょうど目の前で同じくポスター発表していたもので、論文の内容もそうですが、とても親近感が湧きました。

scrapbox.io

京都旅行

なぜか京都に行きたくなったので行ってきました。適当に京都に行くの普通に最高ですね。

11月

11月は論文執筆がメインの1ヶ月でした。

論文執筆

12月初旬に締め切りのある学会に向けて論文を書いていました。今回の今までキツキツだった執筆スケジュールと異なり、それなりに余裕のあるスケジュールで執筆をすすめることができました。

12月

12月は引き続き論文執筆をしていました。後半は温泉に行ったりアドベントカレンダーを書いたりしました。

論文締め切り

それなりに余裕があるなと思いながら執筆していましたが、直前はやっぱり色々ドタバタしますよね。なんとかサブミット出来ました。

Gunosy DM 発表

RecSys2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

草津旅行

後輩がcall for 草津温泉をやっていたので乗りました。

アドベントカレンダー執筆

実は密かに研究室アドベントカレンダーをやりたいと夢見ていました。

今年はアウトプットできる人材も増えてきたので、みんなを巻き込んでアドベントカレンダーをやりました。弊学の学部1年生から4年生、修士1,2年やOBOGを巻き込みました。隣の研究室の子も巻き込んだりして壮絶な感じになりましたが、無事完走したので良かったです。嬉しかったです。夢を叶えました。

adventar.org

ちなみに私が書いた記事は以下の4つです。なんだかんだアウトプットするのって大変なので強制的にアウトプットできるこの機会はありがたいです。

shunk031.hatenablog.com

shunk031.hatenablog.com

shunk031.hatenablog.com

shunk031.hatenablog.com

番外編

番外編として美味しいご飯や飲んだタピオカミルクティー、綺麗な景色のツイートを貼ります。

美味しいごはん

KDD執筆に向けてメンターさんが連れて行ってくださった馬刺しや寿司です。美味すぎて馬になりました。

タピオカミルクティー

タピオカミルクティーにどハマリした一年でした。飲んだタピオカミルクティーを順不同で適当に貼ります。

綺麗な景色

綺麗な景色は綺麗でした。初めて六本木ヒルズの頂上に行きました。

まとめ

トップカンファレンスに論文が採択されたことにより、半ば人生が変わってしまいました。楽しさが単調増加していた1年でした。素晴らしい人たちとコラボして研究をしたりインターンをしたりできたので、より幸せだったと思います。

ありがたいことに来年も色んな方々とコラボできる話が進んでおり、とても楽しみです。「こいつと組んでみたい」と思ってもらえるように研鑽を積んでいきます。そのほかコラボしていただける方や企業さま、@shunk031にご連絡いただければと思います。では良いお年を。

*1:Preferred Networks、深層学習の研究開発基盤をPyTorchに移行 | 株式会社Preferred Networks https://preferred.jp/ja/news/pr20191205/

*2:optuna/optuna: A hyperparameter optimization framework https://github.com/optuna/optuna

*3:実家に帰るとエーアイとかいうわけわからん研究してないで早く就職してくれとよく言われます。

*4:こちら資料は公開していません。もしもご興味がありましたらご連絡いただければ…

*5:Content-Based Citation Recommendation - ACL Anthology https://www.aclweb.org/anthology/N18-1022/

*6:勉学にあまり理解のない家族の人たちにも、流石に複数回受賞していると遊んでいるんじゃなくてちゃんと研究してる感が伝わるようです。

Allentuneを用いたAllenNLPモデルのハイパーパラメータのチューニング

こんにちは@shunk031です。

この記事は彌冨研 Advent Calendar 2019 20日目の記事です。

前回の記事は「期待検証性能(expected validation performance)」をもとにしたパラメータ探索の検証についてでした。

shunk031.hatenablog.com

今回の記事はallentuneを用いたAllenNLPモデルのハイパーパラメータチューニングについて紹介します。このallentuneには 期待検証性能 によるハイパーパラメータ探索の検証が行える手法が実装されています。

github.com

AllenNLPはPyTorchで構築されたリサーチにフォーカスしたオープンソースNLPライブラリです。

github.com

アルゴリズム

ハイパーパラメータのサンプリング手法

ハイパーパラメータ探索のアルゴリズムとして、random searchgrid search が実装されています。これらは Rayが提供しているものを使用しています。

期待検証性能によるパラメータ探索の検証

allentuneのアルゴリズムは以下の論文が元になっています。

arxiv.org

使い方

基本的にはallentuneのREADMEを参考に手順を踏むと実行可能ですが、依存しているパッケージのバージョンまわりで少しハマりポイントがあります。

インストール

レポジトリからクローンしてきてpipでインストールします。

$ git clone https://github.com/allenai/allentune.git
$ cd allentune
$ pip install --editable .

2019年12月現在の情報

このとき、普通にインストールすると依存でTensorflowの最新版(2019年12月現在v2.0.0が入ります)がインストールされますが、Rayが2系に対応していないため、Tensorflow 1.xxx系 を使ってください。

モデルの設定

学習を行うモデルの設定を記述します。例として classifier.jsonnet として定義しています (公式の設定例)

ハイパーパラメータとなる値は環境変数を通じて設定されるので std.extVar 等のjsonnetのメソッドを通じて流れるように設定ファイルを記述する必要があります。

通常のAllenNLPでのjsonnetでは相対パスが読み込めますが、allentuneの場合はjsonnetに相対パスを書いている場合は相対パスが解決できずエラーで読み込めなくなります。絶対パスを書く必要がありそうです。

探索範囲の指定

search_space.json (公式の設定例) を作成して、探索範囲を指定します。allentuneでは以下のサンプリング手法がサポートしています:

  • choice
    • 指定した要素群から選択する手法
  • integer
    • 指定した範囲内で整数をランダムにサンプルする手法
  • uniform
    • 指定した範囲内で一様分布に従った浮動小数点数をサンプルする手法
  • loguniform
    • 指定した範囲内で対数一様分布に従った浮動小数点数をサンプルする手法

ハイパーパラメータとして与えたい変数と、そのハイパーパラメータのサンプリング手法、そしてその範囲を与える形です。

実行方法

パラメータの探索範囲をと探索方法を指定する search_space.json とモデルの設定ファイル classifier.jsonnet が用意できたら、以下のように allentune コマンドを用いてハイパーパラメータ探索を開始できます。

$ allentune search \
    --experiment-name classifier_search \
    --num-cpus 56 \
    --num-gpus 4 \
    --cpus-per-trial 1 \
    --gpus-per-trial 1 \
    --search-space examples/search_space.json \
    --num-samples 30 \
    --base-config examples/classifier.jsonnet

--num-gpus に50を渡すと50GPUに対してハイパーパラメータ探索が実行されます。あとは実行して最強のハイパーパラメータを探してもらうだけです。論文でも読んで待ちましょう。

探索結果の確認

ハイパーパラメータの探索結果を確認する場合、以下のコマンドを実行することで performance-metric に指定したメトリックに対してベストなハイパーパラメータを確認することが可能です。

$ allentune report \
    --log-dir logs/classifier_search/ \
    --performance-metric best_validation_accuracy \
    --model cnn

期待検証性能の可視化

ハイパーパラメータの探索施行数と期待検証性能の関係図をプロットすることが可能です。 期待検証性能がサチってきていることがわかれば、それ以上探索しなくてもよくなります。

$ allentune plot \
    --data-name IMDB \
    --subplot 1 1 \
    --figsize 10 10 \
    --result-file logs/classifier_search/results.jsonl \
    --output-file classifier_performance.pdf \
    --performance-metric-field best_validation_accuracy \
    --performance-metric accuracy

所感

allentuneを用いたAllenNLPモデルのハイパーパラメータチューニングについて紹介しました。 ちょうどこのブログを書いていたときにallentuneでハイパーパラメータ探索を実行していました。

こんにちは@shunk031です。 Geforce RTX 2080Tiを50枚ほど使うとぽかぽかします。みなさんもぜひ試してみてください。

ハイパーパラメータ探索のライブラリでは hyperoptoptunaGPyOpt 等がありますが、AllenNLPで実装したモデルに対して簡単にチューニングを実行できるallentuneはNLPの研究者や技術者には必須のものであると考えています。ぜひみなさん使ってみてください。

「期待検証性能(expected validation performance)」をもとにしたパラメータ探索の検証

こんにちは@shunk031です。 温泉は素晴らしいですが、ホテルのインターネットが遅いと生きた心地がしないので人生難しいと感じています。

この記事は彌冨研 Advent Calendar 2019 19日目の記事です。

f:id:shunk031:20191219192507p:plain

今回はAllenAiから公開されているハイパーパラメータ探索allentuneに実装されているアルゴリズムであるShow Your Work: Improved Reporting of Experimental Resultsを紹介します。

arxiv.org

背景および導入

自然言語処理の研究において、しばしば提案手法が先行研究よりも優れたテストスコアを出すことによって提案手法の良さを実証するというロジックで論文が書かれます。この論文では、こうしたテストデータに対するスコアだけで手法の良し悪しを判断するのは難しいことを述べています。また、validationデータを用いたモデルの訓練で得られるスコアに焦点を当てて検証を行っています。

本論文では computation budget (例えばハイパーパラメータの探索回数やモデル全体の訓練時間) を関数として、ベストなモデルを発見するに至るまでの expected validation performance (期待検証性能) を示しています。こうした指標に従って筆者らが先行研究の再検証を行った結果、より多くの時間を掛けてモデルを訓練することで、報告されているスコアとは異なるスコアになる場合があることを表しています。

期待検証性能

異なるハイパーパラメータ  h を割り当てられた複数のモデル  \mathcal{M} の集合  \mathcal{H}_{\mathcal{M}} を考えます。 あるハイパーパラメータ h_i で訓練されたモデルを  m_i \in \mathcal{M} とします。 ハイパーパラメータを探索するにはたくさんの計算リソースが必要です。今回はそのリソースを表すような関数を computation budget  \mathcal{B}として定義しておきます。

最適なハイパーパラメータ  h_{i*} が見つかったときに、そのパラメータを設定した  m_{i*} に対してテストデータにおけるスコアを論文に書きます。 ここで、 n 個のハイパーパラメータがある場合のベストなvalidationスコアは以下のように定義できます:

 v_{n}^{*} = {\rm max}_{h \in \{h\_{1}, \cdots, h\_{n} \}} \mathcal{A}(\mathcal{M}, h, \mathcal{D}_T, \mathcal{D}_V)

ここで、 \mathcal{A}はtrainデータ \mathcal{D}_Tで学習させたモデル群 \mathcal{M}とそのハイパーパラメータ群 hにおけるvalidデータ \mathcal{D}_Vに対するvalidationスコアを返す関数です。

上記の式をもとに、異なるハイパーパラメータで何度も繰り返しvalidationスコアを計算したときに、 V_{n}^{*}の分布が得られます。 従って、期待性能  \mathbb{E}[V_{n}^{*}\ | n ]として推定可能になります。

本論文では、実験結果を得るために必要な計算コストを概算する方法を導入します。  n 個のハイパーパラメータにおける期待性能は以下のように定義できます。

  \mathbb{E} [{\rm max}_{h \in \{h\_{1}, \cdots, h\_{n} \}} \mathcal{A}(\mathcal{M}, h, \mathcal{D}_T, \mathcal{D}_V) | n]

この指標を用いることで、あるスコアに到達するまでに必要な計算コストについて知ることができます。 特にvalidationスコアに対する期待性能を 期待検証性能 と呼んでいます。

ハイパーパラメータ探索を行う際の推奨事項

ハイパーパラメータの値を決める手法として、 grid searchuniform sampling が一般的に使われます。また適応的にハイパーパラメータをサンプリングするベイズ最適化も有名です。

こうしたハイパーパラメータ探索を検証するために、実験の再現性を担保するためのチェックリストが示されています。 特に本論文で導入されている 期待値検証性能 を基にしたパラメータ探索の検証を行うために必要な項目もあります。

再現性を担保するためのチェックリスト

研究者が報告する実験結果の再現性の向上のために、以下のようなチェックリストが論文内で提供されています。

  • 実験結果の報告について
    • 計算リソースについて
    • 各アプローチの平均実行時間
    • train/validationの分割の詳細情報
    • 報告された各test結果に対応するvalidationのパフォーマンス
    • 実装の公開リンク
  • ハイパーパラメータサーチについて
    • 各ハイパーパラメータの探索域
    • ベストモデルにおけるハイパーパラメータのセッティング
    • ハイパーパラメータ探索の試行回数
    • ハイパーパラメータのサンプリング手法
    • validationのパフォーマンスの期待値

EMNLP2018におけるチェックリストの集計結果

以下は上記のチェックリストに対する有無のパーセンテージを示しています。

  • 実験結果の報告について
    • 計算リソースについての有無: 18%
    • 各アプローチの平均実行時間の有無: 14%
    • train/validationの分割の詳細情報の有無: 92%
    • 報告された各test結果に対応するvalidationのパフォーマンスの有無: 24%
    • 実装の公開リンクの有無: 30%
  • ハイパーパラメータサーチについて
    • 各ハイパーパラメータの探索域の有無: 8%
    • ベストモデルにおけるハイパーパラメータのセッティングの有無: 74%
    • ハイパーパラメータ探索の試行回数の有無: 10%
    • ハイパーパラメータのサンプリング手法の有無: 14%
    • validationのパフォーマンスの期待値: 10%

特にハイパーパラメータの探索域や試行回数が論文中に記述されない場合が多いようです。最近は実装が公開されている論文も多く見られるように感じますが、それでも30%程度であることも驚きでした。

おわりに

今回、allentuneに実装されているShow Your Work: Improved Reporting of Experimental Resultsで提案されている 期待検証性能 について触れました。計算コストの観点から期待できる性能をもとに検証を行っていました。

ハイパーパラメータ探索の再現性を担保するために、計算リソースの規模やハイパーパラメータ探索関連の設定等のチェックリストが示されていました。 より大規模化するモデルとそのハイパーパラメータ探索をより再現しやすくするために、こうしたプロトコルで適切に評価し、再現できるような世界になるとよいですね。私自身もこうした点に注意したいと思います。

GitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushする

こんにちは@shunk031です。草津温泉からこの記事を書いています。温泉は良いぞ。

この記事は彌冨研 Advent Calendar 2019 17日目の記事です。

f:id:shunk031:20191217000530p:plain
クジラ(docker)の上に乗るタコ(Octcat)とめかぶ(MeCab

私のレポジトリshunk031/mecab-neologd-py3では、最新のmecab-ipadic-neologdを持つpython3用のdocker imageをTravisCIを使って定期的にビルドし、Docker Hubにpushしています。 今回はGitHub Actions公開に伴い、TravisCIからの乗り換えを行います。

github.com

以下、2019年12月現在の情報です。

GitHub Actionsを有効にする

まずはGitHub Actionsを有効にします。 こちらから指示に従ってGitHub Actionsにアクセスできるようにします。

Sign up for the beta をクリックして進みます。

f:id:shunk031:20191113082526p:plain
Features • GitHub Actions https://github.com/features/actions

自身のユーザーアカウントが選択されている状態で Register for GitHub Actions Beta をクリックします。

f:id:shunk031:20191122163716p:plain
GitHub Actionsに登録します

はい、完了です。早いですね。では対象のレポジトリで Actions タブが現れていることを確認します。

f:id:shunk031:20191122163558p:plain
これでGitHub Actionsにアクセスできるようになりました。

Actions タブが追加されています。今後はこのタブから設定を追加していきます。

f:id:shunk031:20191113082403p:plain
shunk031/mecab-neologd-py3: My dockernized mecab-ipadic-neologd with mecab-python3 https://github.com/shunk031/mecab-neologd-py3

GitHub Actionsでdocker imageをビルドする

GitHub Actionsでdocker imageをビルドするワークフローを定義します。 Actions タブを選択すると、レポジトリの内容から自動的にマッチするワークフローがサジェストされています。今回は以下の Docker image ワークフローをベースに、docker imageをビルドするワークフローを定義します。

f:id:shunk031:20191122163840p:plain
Actionsタブが追加されています。

以下が完成したワークフローです。GitHub Actionsのワークフローはyaml形式で記述します。

name: Docker Image CI

on:
  push:
  schedule:
    - cron: "0 0 * * 2,5"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@master
      
    - name: Sign in Docker Hub
      run: docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
      
    - name: Build and push Docker image
      run: |
        docker build -t shunk031/mecab-neologd-py3 .
        export TAG=`date +%Y.%m.%d`
        docker tag shunk031/mecab-neologd-py3 shunk031/mecab-neologd-py3:$TAG
        docker push shunk031/mecab-neologd-py3:$TAG
        docker tag shunk031/mecab-neologd-py3 shunk031/mecab-neologd-py3:latest
        docker push shunk031/mecab-neologd-py3:latest

steps にワークフローの各ステップを記述します。今回Docker Hubにdocker imageをpushするにあたり、Docker HubへのログインDocker imageのbuildとpush にステップを分けて実行させました。

Docker Hubへのログイン

Sign in Docker Hub と名前をつけたステップに、Docker Hubへのログイン処理を記述しました。ログインするにあたり、Docker Hubの usernamepassword が必要になるため、Secrets 画面にて DOCKER_HUB_USERNAMEDOEKCER_HUB_PASSWORD を設定しました。これらの変数は表からは直接見えないように暗号化されます。

f:id:shunk031:20191216231609p:plain
Secrets

このようにSecretsで設定した変数はyamlファイル内で ${{ secrets.DOCKER_HUB_USERNAME }} のように参照することが可能です。

Docker imageのbuildとpush

Build and push Docker image と名前をつけたステップに、docker imageのビルド等の処理を記述しました。

私の場合、最新の辞書を持ったimageがlatestになるよう、またビルドした日付をタグに付与しています。日々新語や道語に対応し変化する辞書の任意の時点でのimageを取得したいというモチベーションです。

cronを用いた定期的なbuildとpush

mecab-ipadic-neologdは月曜と木曜に更新されます*1。したがって、その翌日の火曜と金曜に新しい辞書を取り込んだdocker imageのビルドを schedulecron 機能で自動ビルドを実現します。

設定方法はlinuxのcronと同様のフォーマットで記述します。私はcronのフォーマットをいつもググって確認しているのですが、以下のようにポップアップで実行される時間が表示されるのでとても便利です。

f:id:shunk031:20191216234529p:plain
実行される時間が表示される。便利。

(おまけ) READMEにバッジを付ける

ここまででGitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushできるようにしました。おまけとしてワークフローが正しく実行されるかひと目で確認できるバッジをREADMEに追加します。

f:id:shunk031:20191122210401p:plain
完成

READMEにバッジを貼る際に必要なURLは https://github.com/(username)/(repository)/workflows/(workflow_name)/badge.svg で取得可能です。 workflow_name は ワークフローを記述するyaml の先頭にある name です。

READMEにバッジをつけるととてもそれっぽくなるので好きです。

おわりに

GitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushするまでの工程を確認しました。GitHubがネイティブに提供するCI/CD環境はあたりまえですがGitHubと親和性が高く、これが無料*2で使えるというのは素晴らしいです。

Acknowledgement

mecab-ipadic-neologdにはいつもお世話になっております。作者の Toshinori Sato (@overlast)さま、ありがとうございます!

KDD'19 論文採択: マルチタスク学習とconditional attentionによる広告クリエイティブ評価

こんにちは@shunk031です。 Geforce RTX 2080Tiを50枚ほど使うとぽかぽかします。みなさんもぜひ試してみてください。

この記事は彌冨研 Advent Calendar 2019 2日目の記事です。

f:id:shunk031:20191201140720j:plain

国際学会KDD2019に論文が採択されました。 KDDデータマイニング分野で最も有名な会議です。 発表は8月にアラスカでありました。ポスター発表での採択です。 個人ブログにも記録として残そうと思います。

プレプリントarXivにアップロードしています。

arxiv.org

論文採択までの道のり

本論文はGunosyとの共同研究での成果となります。論文採択までの道のりは以下のGunosyデータ分析ブログに詳しく書きました。

data.gunosy.io

KDD採択による外部発表

KDD採択に関連して、勉強会や学会に招待していただきました。

ICML/KDD 2019 Pre-conference session

LAPRASさん主催の ICML/KDD 2019 Pre-conference session にて、概要の発表を行いました。

lapras.connpass.com

テキストアナリティクスシンポジウム

第15回 テキストアナリティクスシンポジウムにて、依頼講演を行いました。 依頼講演のあとはリサーチインターン生とメンターを交えてパネルディスカッションの時間がありました。

speakerdeck.com

参加レポート

KDDに参加した際の参加レポートを書きました。 僕は主に「広告xIT」や「解釈性・公正性」に関連したチュートリアルやワークショップに参加しました。

テンセントの広告技術が未来すぎる!AdKDD2019のテンセントAds招待講演まとめ

data.gunosy.io

公平性および説明性を考慮した機械学習 in KDD2019

data.gunosy.io

その他

KDD採択に関連して、いろんな方々に論文を読んでもらうことができました。 いくつかピックアップして以下に取り上げます。

arXivTimesさん

arXivTimesさんに取り上げてもらいました。ありがとうございます。

github.com

LINEさん

LINEさんの社内分析会議で取り上げてもらえました。ありがとうございます。

speakerdeck.com

所感

今回採択された論文はたくさんの人の支えが合って執筆できたものです。締め切り前は必死に論文を書いていたのを今でも思い出します。 たくさんの思いがこもっているエモい論文がこうして素晴らしい学会に採択されて少しホッとしました。

これからもたくさんの人とコラボレーションしながら、楽しく研究をやっていきます。

2018年の振り返り

こんにちは。@shunk031です。クリスマスにニューラルネットワーク"力"をお願いしましたが、何も貰えませんでした。サンタさんはHinton先生ではないみたいです。毎年同じお願いをしている気がします。

驚くべきことに2018年も今日で終わりみたいです。この1年何をやってきたか振り返りも兼ねて、思い出せるイベントについて軽く残しておこうと思います。

1月

2018年の目標をざっくり決めた

やりたいことをざっくり決めました。 shunk031.hatenablog.com

卒論執筆

卒論を書いてました。そんなに苦しまずに書けました。真面目に研究進めててよかったです。

言語処理学会予稿執筆

卒論でやっていたことを言語処理学会用に書き直していたりしました。こっちのほうが予稿が公に公開されるので先生のレビューが大変でした。初めてちゃんとした予稿を書いたので勉強になりました。

2月

頭痛が続く

2週間近く頭痛が続き、1週間ほどパソコンを触れないぐらいでした。病院で脳CTと血液検査を行いました。結果、脳は特に問題なかったのですが血液検査で肝臓が悪いことが判明して謎でした。処方された薬を飲んでいたら頭痛も治りました。人間の体って難しですね。

JSAI Cup 2018 人工知能学会データ解析コンペティションに参加

SIGNATEのクックパッドコンペに参加していました。去年よりもいい順位になったので少しは成長しているのでは説がありました。

www.slideshare.net

3月

言語処理学会 2018 in 岡山

岡山で開催された言語処理学会に参加しました。

卒業旅行

言語処理学会終わりに岡山から広島、島根を回りました。

大学卒業

え、もう大学4年間終わるんですか?という感じでした。とても充実した4年間でした。

FaberCompanyインターン

参加しました。3日で10万円もらえて最高でした。

mieru-ca.com

第2回Cpaw AI Competition主催

主催しました。参加者の方々に満足していただけてよかったです。

connpass.com

4月

大学院入学

学部から引き続き法政大学の大学院に進学しました。同時期にGPUが40枚ぐらい一緒に入学してきました。

NVIDIA Deep Learning Seminnerに参加

参加しました。最先端の研究事例とかを聞けて楽しかったです。

blogs.nvidia.co.jp

5月

研究室運動会

毎年やってるんですが、めちゃくちゃ楽しいです。

運動会の裏側 | 彌冨 仁研究室

AIPR2018執筆

卒論でやっていたことをまとめて国際学会に出そうということでやっていました。

arxiv.org

6月

DLLabハッカソン参加

参加しました。当日にチームに振り分けられ、対象データセットを用いた識別器を作るハッカソンでした。Azure上でdockerを動かして識別器を構築する感じでした。途中dockerコンテナがハングして消し飛んでしまい、ボリュームもマウントしていなかったのもあってスナップショットも消えてしまいました。スコア的にはトップを取れそうだったので悲しかったです。このあとめちゃくちゃdocker勉強しました。

dllab.connpass.com

Piascore DLアドバイザー

DLLabハッカソンでSoTAを詰め込んだ手法でモデルを構築しているところを認められ、同じチームだったpiascoreさまにお話を頂いてdeep learning技術中心のアドバイザーを始めました。僕自信もとても成長できるディスカッションを複数回させていただき、とても勉強になりました。

piascore.com

7月

バイト

何社かサマーインターンを応募して受かっていたのですが、最終的には好きなことをやらせていただけて時給も他社と合わせていただけたgunosyで広告周りの研究開発をさせていただくことになりました。

ISIC2018コンペティション参戦

ISIC2018の皮膚障害自動診断システムのコンペティションに参加していました。このころ結構大変で辛かった思いがあります。そもそもメインでNLPをやっていたのでCV系の話で英語論文書くとは思っていなかったです。

arxiv.org

8月

バイト

引き続き広告周りの研究開発をやっていました。そのままYANSに出そうという流れでエイヤでやりました。メンターさん、指導教員両方にとても迷惑を掛けてしまう感じになってしまったのですが結果をまとめられてよかったです。

HackU最優秀賞受賞

時間がない中進めていたHackUにて最優秀作品賞をいただくことができました。初めてみんなとチーム開発できたので楽しかったです。

shunk031.hatenablog.com

YANS2018 in 香川

夏休みにgunosyでやっていたことをまとめてYANSで発表しました。うどんを食べまわったのをよく覚えています。

data.gunosy.io

9月

Cpaw LT

LTで皮膚障害自動診断の最新動向について発表しました。

speakerdeck.com

研究室合宿

今年は秩父でした。B4が卒論中間発表の練習をするのを応援するだけなので修士ポジションは楽でした。最終日雨の中ラフティングをやったのをよく覚えています。

10月

AIPR2018参加

初めての国際学会で、そもそも初めての海外でした。めちゃくちゃ楽しかったです。また論文書いて海外行きたいです。

shunk031.hatenablog.com

shunk031.hatenablog.com

shunk031.hatenablog.com

shunk031.hatenablog.com

第3回Cpaw AI Competition主催

主催しました。参加者の方々に満足していただけてよかったです。

cpaw.connpass.com

11月

大学院の授業で論文読み

大学院のヒューマンインターフェースの授業で論文読みをやりました。

speakerdeck.com

初めての国際学会も終わったところで、こんなことを考えてました。

12月

Kaggle Meetup Tokyo LT参加

これまで主催してきたCpaw AI Competitionの話をさせていただきました。各所から同様のことをやりたいというお話もあり、いろいろなフィードバックをいただくことができました。

speakerdeck.com

アドベントカレンダー執筆

初めてアドベントカレンダーなるものに2つほど参加して記事を書きました。

shunk031.hatenablog.com

shunk031.hatenablog.com

修論中間発表

学会で発表したものをそのまま発表しました。難なく終わってよかったです。

国内学会論文執筆

情報処理学会2019と言語処理学会2019を並行して書いてます。大変なことになってます。

実装とか

Chainerを用いた再現実装をいくつか公開したりもしました。最近はPyTorchも書いたりしてます。

github.com github.com github.com github.com github.com github.com github.com github.com

まとめ

外部で発表することが多い1年でした。B4でインプットしたことを吐き続ける1年だったなとも感じます。来年はM2となり進路を考えなければならなくなったりと、純粋に研究だけに打ち込める時間が減りそうなのが心配です。引き続きインプット・アウトプットを大切にしていきます。