naoya_t@hatenablog

いわゆるチラシノウラであります

DL4US (Deep Learning for all of us) 修了

東大松尾研監修のディープラーニングのオンライン講座 DL4US を受講し、無事修了しました。
f:id:n4_t:20180424113723p:plain
内容の大部分は書籍やCourseraの講義、普段の業務などで既知のものでしたが、知識を更新しながらコードに落として確認していく作業は有益でした*1。最後の辺り、GANやVAE、深層強化学習の辺りは概念的には知っていましたが実際にコードを書いてみるのは初めてで楽しかったです。最終レポートの提出期限は2回延長されたのですがその締切時刻に間に合わず日が変わってからの投稿になってしまいましたがacceptして頂けました。(ありがとうございます)

応募、オンラインテスト、抽選

12/30の締め切り直前に(割と軽い気持ちで)応募しました。
想定を大幅に上回る?1900人からの応募があったとのことでした。抽選で落ちた皆さんの声をtwitterで大量に目にする中、運良く抽選に通り受講することになりました。

その後行われたオンラインテストでは、Numpyで行列の基本操作を行うような問題(2時間で25問)が出題されました。これは選抜目的というよりは受講資格の確認のためのものといった感じでした*2。時間的には余裕があったのでコンソールでも配列を操作して確認しながら淡々と答えて行きました。

オンライン学習環境 iLect

GPU付きのjupyter labを課金で利用できる iLectというオリジナルのオンライン学習環境上で行われました。DL4US受講生は無料で利用できるよう適宜クレジットが与えられました。*3

講座の進め方

講義はサンプルコード入りの教材コンテンツがjupiter notebookとして iLect で毎週1レッスン分ずつ配信されました。(ビデオ等はありません)。*4

各レッスンは基本→応用→課題、のような構成で、基本・応用それぞれにnotebookが2枚ずつ用意されていて、1枚め(コード入り)で勉強して2枚め(コード部分が白紙)でおさらい、という流れでした。
宿題はレッスン2とレッスン4の後に1回ずつ、あと最後にこれまで習った事を応用して何かやるという最終課題が課せられました。

使用フレームワークはKeras(TensorFlowバックエンド)でした。

講座の内容

内容の大部分はCourseraの講義、書籍、普段の業務などで既知のものでしたが、知識を更新しながらコードに落として確認していく作業は有益でした。最後の辺り、GANやVAE、深層強化学習の辺りは概念的には知っていましたが実際にコードを書いてみるのは初めてでした。

教材は何人かのスタッフによって執筆されたようで、用語やコーディングスタイルの統一がとれていないのが難といえば難*5ですが、これは今後改善されることを期待したいです。

【あとでもう少し加筆予定】

Lesson1: 手書き文字認識 / ニューラルネットワーク入門

Deep Learningとは, ニューラルネットワーク, 誤差逆伝播イメージ, Keras入門, 学習とテスト

Lesson2: Deep Learningで物体認識 / CNN & ResNet

CNN基礎, Convolution, Pooling, Initializers, Optimizers, Early stopping, CNN応用, VGG16,ResNet, トレーニング済みネットワークの利用, データ拡張

〈宿題1〉

今Lessonで学んだことに工夫を加えて, CNNでより高精度なCIFAR10の分類器を実装してみましょう.
ネットワークの形などは特に制限を設けません.
精度上位者はリーダーボードに載ります.

Accuracy90%超えを目指して頑張ってみましょう.

この週は時間が取れず、レッスンのサンプルコードに毛が生えた程度のものを締め切り間際に提出してお茶を濁すことになりました。精度は70%前後だったかと思います。*6

Lesson3: ニューラル翻訳モデル / Seq2Seq, LSTM, Attention

RNN基礎, LSTM, Word Embedding, Sequence to Sequence, ニューラル機械翻訳

Lesson4: 画像からキャプションを生成 / Attention

画像とテキストの利用, アテンション, キャプション生成

〈宿題2〉

RNNを用いて高精度な英日翻訳器を実装してみましょう。

ネットワークの形などは特に制限を設けませんし、今回のLessonで扱った内容以外の工夫も組み込んでもらって構いません。

精度上位者はリーダーボードに掲載させていただきます。(精度の評価はBLEUスコアによって行います。)

今回は少し頑張りました。Courseraで似たような実装をした経験もあり、beam search(DL4USではLesson5-3で扱いました)も織り込みながら実装したものを提出しました。
f:id:n4_t:20180424103027p:plain:w320
全翻訳結果
完璧からは程遠い(BLEUスコア20ぐらいでこんな感じ)翻訳ではあるものの、できるだけ原文の意味に「近い」訳文を編み出していく努力*7のようなものを感じました。

→Leaderboard 8位に入りました!
f:id:n4_t:20180424102904p:plain

Lesson5: 画像の生成 / 生成モデル, VAE, GAN

生成モデル, VAE, GAN, オートエンコーダー, 画像生成

Lesson6: ゲームをプレイする人工知能 / 強化学習, DQN

強化学習の基礎, 強化学習, DQN, Atariゲームを学習

〈最終課題〉

【課題】 授業で学んだ技術を利用して独自プロジェクトに取り組み、その結果をレポートしてください

今まで勉強してきた技術を利用してモデルを学習・テストするプロジェクトに取り組み、学習過程や結果を分析してください。 データ作成・モデル設計・学習・検証までの一連の流れに取り組んでいただき、その結果をレポート形式で提出していただきます。

学習過程や結果の分析、学習の様子、学習とテスト、技術的な工夫点、トライ&エラーした点などをA4サイズ4〜8ページのレポート(PDF)にまとめて提出するように求められました。
独自性・アイデア、完成度、技術的困難度を基準に採点されるそうです。

文章生成系のことで何かやりたいと思っていて、お題候補として

・ことわざ生成(任意のテキストを故事成語っぽく要約する)
・俳句生成(GANを使って俳人っぽい俳句を生成する)

を考えていたのですが、俳句のほうがデータの準備が楽かなと思って俳句生成にしました。題して「芭蕉風の俳句を詠む GAN を作る」です。*8

Lesson4のニューラル翻訳(seq2seq)の時の、LSTMを用いたencoder-decoderに俳句文を入力し、出力にも同じ俳句文を指定することでコンテキストを学習し、学習した翻訳機の encoder 出力 + コンテキスト (states value) を GAN で 模倣させる、というアプローチを取りました。(この方法に正当性があるのかは分かりませんが)

芭蕉の俳句は、webに解説つきで公開してくださっている方が何人かいらっしゃるのでスクレイピングしてきました。
MeCab形態素解析する際に、UniDic の近世口語バージョン辞書を初めて使いました。

より俳句っぽい出力が高スコアになるようにスコアリングを工夫してみました。確率値の合計に加え

  • (文末において)読みの長さが 17 ないし 18 か
  • 出力トークン列の読みの文字数の文頭からの累計が 5(ないし 6)、12(ないし 13)を踏んでいるか

を考慮しました。

モデルの学習はLSTM部分は 500 エポック(GPU で3分程度)、GAN は 32 件ずつのミニバッ チで 5000 ステップ(0.4 秒/ステップ程度)試しました。
以下の出力は Generator で5件ずつサンプリングしたものです。

step=100:
ほととぎすいろいろ梅さへ飛ぶて馬 (ホトトギスイロイロウメサエトブテウマ)
ほととぎす梅椿早咲き褒めん (ホトトギスウメツバキハヤザキホメン)
ほととぎすいろいろ春にて柳髪 (ホトトギスイロイロハルニテヤナギカミ)
ほととぎす椿早咲き褒めんの五 (ホトトギスツバキハヤザキホメンノイツ)
ほととぎす梅椿早咲き褒めん (ホトトギスウメツバキハヤザキホメン)

...

step=500:
---
ほととぎす梅椿鼠の麦ぞ (ホトトギスウメツバキネズミノムギゾ)
ほととぎす椿早咲き褒めんよ雪 (ホトトギスツバキハヤザキホメンヨユキ)
冬籠りほととぎす早咲き陰や云々 (フユゴモリホトトギスハヤザキカゲヤ)
ほととぎすいろいろ花春飛ぶて馬 (ホトトギスイロイロハナハルトブテウマ)

...

step=4500:
冬籠りほととぎす椿鼠や云々 (フユゴモリホトトギスツバキネズミヤ)
冬籠りほととぎす早咲き陰よ云々 (フユゴモリホトトギスハヤザキカゲヨ)
ほととぎすいろいろ春酒に炬燵 (ホトトギスイロイロハルザケニコタツ)
ほととぎす消え行く消炭に漏る (ホトトギスキエユクケシズミニモル)
冬籠りほととぎす椿鼠の云々 (フユゴモリホトトギスツバキネズミノ)

...

step=5000:
ほととぎす梅椿裏見の梅ぞ (ホトトギスウメツバキウラミノウメゾ)
ほととぎすいろいろ春にて飛ぶてかな (ホトトギスイロイロハルニテトブテカナ)
ほととぎす消え行く羽織よ腰ぞ摺 (ホトトギスキエユクハオリヨコシゾスリ)
ほととぎすいろいろ花春飛ぶて馬 (ホトトギスイロイロハナハルトブテウマ)
ほととぎす椿早咲き褒めんよ雪 (ホトトギスツバキハヤザキホメンヨユキ)

期待していたほどの精度ではないものの、それらしい文を吐き出すところまで出来ました。
何かすこし学んでいるような気もするし何も学習していないような気もするし微妙な結果なのだけれど、実際に使われている単語が並ぶだけでも何となく雰囲気が出てしまう、という感じです。
「俳句らしさ」のスコアリングをもう少し工夫(正確なモーラ数、季語の 有無のチェックなど)したほうが良いかもしれません。

修了!

最終課題レポートの提出期限は2回延長されたのですがその締切時刻に間に合わず日が変わってからの投稿になってしまいましたがacceptして頂けました。(ありがとうございます)

当初の予定では3月下旬には修了証の発行がなされるはずでしたが、レポート締切も延長し、生徒が増えた分採点にも時間がかかったためでしょうか、修了の通知を頂いたのは4/18でした。(修了証の発行はまだこれからです)

*1:この分野は進化がとても速いので定期的に知識をアップデートしていく必要がありますね。

*2:「暫定的 NumPy チュートリアル」(拙訳)が役に立ちます。

*3:当初1人GPU1枚と言う話だったと思いますが、人数が増えたので2人か3人に1枚だったかもしれません。jupyter notebookのテキストを(コードを実行せずに)読むだけでも課金(クレジット消費)が始まってしまう仕組みなのは少し残念に思いました。一回起動して放置していると(手動で延長はできるものの)2時間で勝手にセッションが切れてしまいログインからやり直さなければならないのも面倒でした。申請すれば無料クレジットのおかわりは可能だけれど手間と待ち時間がかかるので、notebookを全てダウンロードして手元の環境やGoogleのColaboratory上で学習していました。

*4:当初予定していた定員枠より多く生徒を取ったため、負荷分散のため受講者をABCの3グループに分けて1日ずつずらして配信されました。

*5:パラフレーズ盛りだくさんだと自分の理解が合っているのか国語力的な意味で不安になります…

*6:人数を増やしたことによるサーバの混雑などを考慮し、宿題や最終課題の期限は何度か延長されました。宿題の成績(精度)優秀者はLeaderboardで発表する、という話でしたが、Leaderboardが公開されたのは最終課題よりも後になってからでした。

*7:昔、通訳の専門学校に通っていたことがありまして。何というか、その頃の頭の働きに似ているような気がしました。

*8:別に松尾研と松尾芭蕉を掛けたわけではないです。