jpとニューラルネットワークでなんかやろうとしたけど時間がなかったやつ【WIP】

はじめに

こちらはなんとなく登録した mstdn.jp Advent Calendar 2017 12月21日担当のかみやまの記事です。

jpとかマストドン全体の使い方とか在り方とか感想に関しては色んな人が良いお話しを書いてくれているから最近趣味でやっているニューラルネットワークと絡めて何か書けないかなと思ったら時間が無かったので、ニューラルネットワークの簡単な説明とそれを使ってマストドンでこんなこと出来る!って妄想を書きます。

ニューラルネットワークって何ですか?かじっていいですか?

脳のニューロンを模倣したネットワークで、複数のニューロンの組であるレイヤーが繋がって出来てる。一個一個のニューロンは入出力を持っていて、出力が前のレイヤーからの複数の入力の重み付け総和になってる。学習させたいタスクに対応した入出力データセットを与えて現在のパラメータでの出力との誤差を出力側から逆伝搬(誤差逆伝搬法)させて、レイヤー間の結合の強さなんかのパラメータを最適化できるネットワーク。例えば、猫の画像を入力すると識別結果:猫って出力するみたいなことができる。

よく例題で使われるのはMNISTっていう28×28の白黒画像で手書きの数字の0~9を識別するタスク。この場合、入力は28×28の行列で出力は10次元の0,1ベクトル(one-hot vector)にするのが一般的(TensorFlowでもそう)。

唐突に始まるニューラルネットワークの歴史

なんと、ニューラルネットワーク(NN)の仕組み自体は1958年にフランク・ローゼンブラットがニューロンの機能を数式化したパーセプトロンを開発した時点であったよ。その後、1979年に現在の多くの画像処理AIに使われているフィルターの重みを学習する感じの畳み込みニューラルネットワーク(CNN)の元のネオコグニトロンを福島邦彦が発表したんだ。次に時系列を処理する再帰的ニューラルネットワーク(RNN)の元を1982年にジョン・ホップフィールドが発表したよ。これらNNは計算量と速度の観点から実用面ではあんまり注目されず大きな発展はしてこなかった。それが最近のゲームのためのGPUの進化によって、こんなに大量のポリゴンの計算一瞬で出来るなら汎用計算にも使えるのでは?となって、元はゲーム用だったGPUを使って汎用計算する発想(GPGPU)が出てきたわけだ。

そういった需要(もちろんゲーム内の破片だとか水とか布の物理現象をシミュレーションするためでもある)を受けて、NVIDIAが専用のアーキテクチャをGPUに入れて更にAPIも合わせたCUDAを作ったんだ。主にそのおかげでNNの計算はもの凄く高速化されて今までは計算時間的にきつかった深くて複雑なNNモデルの学習も現実的な時間で終わるようになった。こうしてNVIDIAは世界を征服したよ(割と本当で征服した途端に使用料を搾取するために安いゲーム用GPUをデータセンターで使うの禁止してきた)。

マストドンにおいてニューラルネットワークで何か楽しいこと

さて、アドベントカレンダー的にはjpやマストドンと絡めなければならないのでこの手のテキストがメインのSNSに対してNNがどんな面白いこと出来るのかを考えてみるよ。

トゥートを学習して何かしよう。何しよう……?

NNが今のところ一番得意なのは識別タスクであらかじめ決められたいくつかのクラスに分類するのが得意、あと画像に特化したCNNが強力なのでMNISTの手書き数字を識別みたいなのが得意。

じゃートゥートみたいな文字列はどうなの?っていうと時系列処理はまだこれからな感じ。上手く行っている例としてはLSTMとCNNを組み合わせた動画のキャプション自動生成とか、Google翻訳の日本語を英語に変換するみたいな翻訳タスクがある。Google翻訳ではseq2seq(sentence to sentence)っていうRNNを応用したNNのモデルで上手いことやっている。Google翻訳のseq2seqが文字列の学習に対して上手く機能しているキーポイントは2つあるよ。

  • word2vec: 【TODO: 説明】
  • attention: 【TODO: 説明】

僕が考えたマストドンにおけるニューラルネットワーク活用術(えっと、ここが未完成のメインテーマです)

  • とりあえずseq2seqで翻訳
  • おすすめユーザー候補
  • おもしろ会話bot
  • トゥートに基づく自動ハッシュタグ付与(温泉の記事からのインスパイア)
  • トゥート内容をオートエンコーダにかけて隠れ層のcontent vectorを主成分分析やらクラスタリングして強制的にユーザーを分散させる
  • 特定ユーザーの発言を学習してそのユーザーが消えちゃっても補完できる丼民補完計画
  • エアリプ自動補完(これNNじゃなくても出来るやつだ)

【TODO: このマストドンとNNで何かやる話しをメインテーマにしたい!……ので後で書き足そう。】

【TODO: というかトゥート取得してなんかやりたい。】

えっ深層学習やりたい?

今はソニーが頑張ってくれたおかげでWindowsでGUIでお手軽深層学習できるからとりあえず以下のNeural Network Consoleをお勧め。NNの最低限の知識は必要だけどモデルの設計から学習まで全部GUIで出来て良い時代になってきたなって思うよ。

https://dl.sony.com/ja/

【TODO: 気が向いたらこいつを使ってマストドンのトゥートを学習する話しをここに書こう。】

GUIなんて生ぬるい!って人は一番有名なTensorFlowをお勧めするよ。

まずはPythonの準備、Windowsの場合はAnaconda 3.6 64bitを、MacやLinuxの場合はpyenv入れた上でpyenv install anaconda3-5.0.0。

GPU版(NVIDIAの新しめのGPUが必要)

CUDAとcuDNNをインストールしてね(登録が必要)

CUDA 8.0 https://developer.nvidia.com/cuda-downloads
cuDNN 6.1 https://developer.nvidia.com/cudnn

conda install tensorflow-gpu

CPU版

conda install tensorflow するだけ!

あとはTensorFlowのドキュメント読むか、最近は上記のインストール一発でTensorflowを扱いやすくラップしたKerasまで入ってくれて簡単だからKerasのドキュメント(日本語だよやったね!)を読むのがいいよ。TensorFlow内のKerasはimport tensorflow.contrib.keras as kerasでimportできるよ。

おわりに

終わりだよ。お湯ぬる大好き!