2019アーバンデータチャレンジ京都 in NDL関西に参加した話

地域課題解決を目的としたオープンデータの利活用を目的として、自治体が企画するコンテストであるアーバンデータチャレンジ2019への応募を目指したイベントである、アーバンデータチャレンジ京都に参加してきた。

2019/11/9に1日かかりでアイディアソンを実施し、2019/12/7にハッカソンが実施されるスケジュール。 アイディアソン終了後のハッカソン開催日までの1カ月間は好きに開発すすめてくださいねーという感じのイベントだった。

ハッカソンでは各チームが色々と事前準備をしてきていたので、最終的なアウトプットはどのチームもすごかった。

アイディアソンの様子。 2019アーバンデータチャレンジ京都 in 関西館 | NDLラボ

うちのチームのピッチ。 https://lab.ndl.go.jp/dataset/UDC2019/ideathon1_MyPlace.pdf

うちのチームはWebアプリを作った。 リポジトリはこちら。 https://github.com/masamasah/my_place

参加した経緯

今期の個人的な目標として、なんしかモノとしてアウトプットするところまでもっていきたいというものがあり、取り組むテーマを探していたところ、たまたま見つけた。 でもなんか一人で参加するのいややなーと思っていたので誰か誘ってみようと思った。

普段から仲の良い同僚から勉強したいけど何作ったらいいかわからず手が止まってしまうという相談を受けていたこともあり、ちょうどいいかもということで誘って3人で参加した。

アイディアソン

まずは自治体が提供しているオープンデータの説明があった。 いろんな種類があって正直すべてを覚えてはいないけど、国会図書館ということもあってかなり興味深いデータがあることがわかった。

これらのデータを活用してどんな地域課題が解決できるか?をブレストしてアイディアだしし、出てきたアイディアをクラスタリングして、各クラスタに興味のある人たちがあつまってチームを形成した。

チームに分かれてからはチームごとにアイディアをブラッシュアップして、ハッカソンで作るべきものの青写真を作った。

ハッカソンまでの過ごし方

もともと開発の勉強がしたいというモチベーションで集まった3人なので、ハッカソン当日までに集まって開発をすすめた。

普段の業務では一人チームで開発しているので、チーム開発ができたことが個人的には凄く楽しかった。

全体的な足回り(インフラ系とか開発環境とか)の整備とPythonでのWebAPI提供を主担当し、Angularでの画面開発なんかも行った。

チーム3人で開発の勉強がしたいということで合意できていたので、成果物を追い求めるというよりは、技術的な解説や不明点の深堀など、知識習得に重きを置いて進めることができた。

ハッカソン当日

学び

ペアプロするうえでは大きいモニタが必須。13インチのMacbook airでは限界がある。

説明することで学びが深まるので、良い機会だった。 普段の業務でもチーム開発がしたくなった。

今回は開発を学びたいという目的でチームが合意できていたが、ペアプロを進めるうえでは方向性を合意しておくことは大事かもしれない。 細かいことは置いといて開発進めようぜ!ってならなくて良かった。 ここの認識があっていないとチームがギスギスしたりするのかな?と思った。

課題

学びが目的であったが、それでも最後のほうはモノとして整えるために急ぐことになった。 もうすこし余裕をもって進められたよかったなぁと反省。 これによって最後のほうは全員が全員理解して進める構造にならないケースがあった気がする。

他のチームのアイディアや実装はかなりユニークなものもあり、もっともっと発想を飛ばせるといいなぁと思った。

最近個人プロジェクトの進捗があまり出せていない。 モチベーションが若干下がってしまっている気がする。

ので、目標達成とかそういう系統の本をまとめて3冊ほど読んでみた。

テーマを固めて一気読みするのはかなり良いかもしれない。

読んだのはこちら。

やり抜く人の9つの習慣 コロンビア大学の成功の科学

やり抜く人の9つの習慣 コロンビア大学の成功の科学

時間術大全 人生が本当に変わる「87の時間ワザ」

時間術大全 人生が本当に変わる「87の時間ワザ」

UCLA医学部教授が教える科学的に証明された究極の「なし遂げる力」

UCLA医学部教授が教える科学的に証明された究極の「なし遂げる力」

3冊の関係性

【成し遂げる力】では、行動を3つに分類している。 無意識に実施しているような行動を「自動行動」、衝動的にやってしまうような行動を「衝動行動」、その他を「一般行動」が3つ。 【9つの習慣】は衝動行動と一般行動を対象としたイメージで、【成し遂げる力】は3つそれぞれを対象としている。

【時間術大全】は他の二冊と比べると日々の実務よりで、tips集に近い。

3冊はそれぞれ根本にあるのは似たような考え方に感じる。 【成し遂げる力】より【9つの習慣】の方が圧倒的に読みやすくはあるので、【9つの習慣】を読んで実践しつつ、日々の行動のサポートとして【時間術大全】を使うようなイメージが良いと思う。

成し遂げる力と9つの習慣

【成し遂げる力】の方がより広い領域を扱っている印象を持った。 実例が豊富なので、実例を得たいならおすすめ。個人的にはちょっと実例が多すぎた。

どちらも目標を具体的にすることの大切さを説いている。 曖昧な目標ではなく具体的にすることが大事。 【9つの習慣】ではあまり理由づけがなかったが、【成し遂げる力】を読むとリンクする部分が多く納得感が得られるかもしれない。 目標を具体的にしておくことで、実現可能な「十分に小さい」タスクに切り分けることができる。

トップダウンでタスクを小さくしておくことでロードマップが引かれるので、実施に際して簡単な状態(実施時に複雑なことを考えなくてもタスクを倒せばいい)にできるのが大きな効果。 これによって成し遂げられる確率が高まる。

具体的な目標に落としていく際に注意が必要なのが「人はどんなサイズの目標に対しても3〜10個のtodoしか思いつけない」ということ。 目標を具体化する際には【成し遂げる力】の梯子モデルを取り入れてタスク化していくことが大事だと思った。

【9つの習慣】ではif-thenプランニングが紹介されているが、これも【成し遂げる力】で「簡単な状態を保つことが成し遂げるために役立つ」という点とリンクするだろう。 ルーチン化された行動は継続が簡単になるし、if-thenの形で行動をあらかじめ決めておいて自動で実行できるような仕組みが目標達成には好ましいんだと思う。

意志力を使った方法はどちらの本でも否定されている。 意志力を使わなくても実現できるようにしておくことが継続のためには重要。

達成するためにはその対象を「魅力的」に感じていることも大切。 重要なことであり価値があることだと信じることができると良い。 この具体的な方法は【9つの習慣】にはないので【成し遂げる力】を参考にすると良いのかもしれない。

脳の可塑性周りの話はどちらでも出てきた。 固定化された知性ではなく、知性は大人になってからも変わるというマインドセットをもって、成長することを大事なことと捉えるのが大切な習慣なのかも。

時間術大全

ここまでで作ったタスクをその日の「ハイライト」として日々倒していく。 なんの戦略もなく日々を過ごすと、せっかく作ったタスクを進める時間が取れない。 これを防ぐために【時間術大全】を参考に、時間を作る。

意志力に頼って集中しようとするのは難しい。物事は簡単な方が良い。 なので気を散らすものはそもそも消してしまおうといったことで、「レーザー」の章が参考になる。

体調が悪い中で意志力に頼って集中しようとしても難しい。 なので集中できる体調を保つために「チャージ」の章も参考になる。 ここで言われていることは【最高の体調】という本で言われていることとも繋がっている。 人の進化の過程に生活を合わせ直そうというような趣旨。 ここに興味があれば【最高の体調】を読むことをお勧めします。

最後の「チューニング」の章は自身へのフィードバックについてのお話。 時間術としていろんな取り組みを実験して、その結果を振り返って次の実験内容を考えるようなものになっている。

このフィードバックのタイミングで【9つの習慣】で述べられていた「目標との距離をフィードバックする」を取り入れても良いのかもしれない。

ある程度テーマを固めた上で何冊か読んでみる取り組みは結構色々考えるきっかけにもなるし良いかもしれないなぁ。

おわり。

自分の小さな箱から脱出する方法の読書メモ

自分の小さな箱から脱出する方法を読んだ。

自分の小さな「箱」から脱出する方法

自分の小さな「箱」から脱出する方法

  • 作者: アービンジャーインスティチュート,金森重樹,冨永星
  • 出版社/メーカー: 大和書房
  • 発売日: 2006/10/19
  • メディア: 単行本(ソフトカバー)
  • 購入: 156人 クリック: 3,495回
  • この商品を含むブログ (418件) を見る

ビジネス書図鑑で紹介されていた書籍で、特に他人を責めがちな考え方に毒されている自分がいるなぁと思っていた問題意識に刺さりそうだな?と感じたので読んでみた。

いい意味で自己啓発的な本だった。 この本を読むという体験を通して「他責思考」から抜け出すためのヒントが得られるし、(詳細は後述するが)抜け出すためのきっかけの一つになる。

一言で?

「こうしたほうが相手のためになる」という自分の考えを裏切ったことで、それを正当化する思考が働き、世界を見る目が曇る。この状態を「箱に入った状態」と呼ぶ。相手も自分もこの状態になっていると、それぞれが自己正当化の目線で相手を見るので、人間関係がドツボにハマる。これがチーム単位になり、会社単位になってくると、チームや会社の目標達成の大きな阻害要因になる。 箱から出るには、箱から出られている状態の時に、自己反省をして、相手を自分と同じく尊重すべき存在であると認識し直す。箱から出た状態を維持するためには、相手のためにするべきだと思ったことは素直に実践し、自分の考えを裏切らないように留意する。

詳細

箱に入るメカニズム

「相手のために〇〇してあげなくちゃ」と思った際に、それを裏切ると、それをしなかったことへの正当化が自分の中で起きる。

相手の欠点を考え始めて、「だから別に〇〇してあげる必要なんてないんだ!」と考えるようになる。 さらに、相手の欠点を深掘りし、「むしろこっちが被害者だわ。。」と考えるようになる。 さらにさらに、自分の良いところを過剰に評価して、自分を正当化しまくる。

このとき作成された箱は別の状況下でも持ち出されるようになる。

箱が強化されるメカニズム

相手が箱に入って自己防衛してくると、こちらも自己防衛のために箱に入るようになる。

箱の中は自分が正当化される心地よい空間である。

相手が自己防衛のための攻撃をしてくると、それを受けてさらに自己正当化がおこなわれ、心地よい箱の中がより心地よい空間として強固なものになる。一種の共犯関係みたいなもの。

つまり箱は原理的に強化されやすいっぽい。

箱から出るためには?外に居続けるには?

箱に入ってる状態ではぶっちゃけ何しても基本ダメ。 どんな人でも常に箱に入っている状態ではないので、箱から出ている状況の時に、自身を見つめ直し、自己反省することが大事。それによって相手を「自分と同様に尊重されるべき個なんだ」と思えるようになると箱から出られる。

箱から出たら外に居続けるためには相手のためにするべきかなーと思った自分の考えを裏切らないことが大切。

感想

「箱」について物語形式で進んでいく。通常の知識本とは異なり、整理されて書かれているというよりは、登場人物の学びを通して理解していくようなスタイルであり、本書の内容的にはそれがしっくりくると感じた。 また、箱から出るための方法として「箱から出た状態にある時に自己反省をする」というものがあげられているが、本書を通じてこの体験ができるように物語形式にしていると感じた。

普段の人間関係の中で、しがらみがある中で、箱から出た状態を意識的に作り、その際に自己反省をするというのは至難の技であると感じる。

まず箱から出た状態の人間関係にいる際に、そうではない相手のことを考えたりすることはあまりないし、考えたとしても自己反省をするという発想にまずならない。 箱から出た状態の人間関係にいる際に、その相手から、そうではない相手のことを考えて自己反省するように促されれば別だが、あいにくそんなことをしてくれる知り合いもいないし、正しく理解させてくれないとその相手に対しても箱に入ってしまいそうだ。

その点本書はわかりやすく解説してくれているし、最悪本を閉じればその後の人間関係に影響はない。 本書に対して箱の外にいることができるなら、箱の外にいる状態で自己反省をするということが果たされるわけで、とても得難い機会になると思った。

余談だが、免疫マップの考え方とも近しいものを感じた。 箱を強化したい・自己正当化したいという裏目的を達成するために、相手をより攻撃的にしてしまうなどはまさにそれ。

本書は自己反省を経て相手を尊重すべきだという考えてこれを解消することを主張しているわけだが、これも裏目的の先入観を解消することで解決する免疫マップの考え方に近いと感じた。

なぜ人と組織は変われないのか読了メモ

冬休みを活用して「なぜ人と組織は変われれないのか」を読んだ。

免疫マップについて解説している本として有名(?)な本。

年末年始は扁桃炎で瀕死で実家に帰れなかったので、自宅にて冬休みの3日間をかけて読みました。

一言で

目標達成できないことを、意志力の欠如や能力不足や努力不足などと捉えずに、対立する別の目標を達成するための合理的な手段であると主張している。

このうえで目標を達成するためには、別の目標を支える固定観念を明らかにして、それを検証して必要に応じて修正していく必要がある。この作業を行うためのものが免疫マップである。

これを作る作業によって目標達成のみならず、主体的に捉えていた固定観念を客体的に捉えることができるようになるので、知性の発達のきっかけが得られる。

感想

400ページを超える大作で読み切れるか不安だったが、読み始めたら問題提起が面白くて、一気に読み進めてしまった。

目標達成できなかった時の無能感というか失敗感は誰でも味わったことがあると思うが、この本は目標達成できなかったことを合理的なこととして捉え、これを乗り越えるためにどうしたら良いか?を豊富な事例とともに説明してくれる。

若干、事例がしつこい感はあった。 「うん、わかった。じゃあどうしたらいいの?どうやったらその免疫マップ作れるの?」と思いながら読み進める展開は、ヒキはあったけど、分量がかなり多いのでちょっと。。。

チーム内で免疫マップを実践することで最大の効果が得られるような感じではあるが、自分の周りでこれを実践できるかどうかはちょっと自身がない。

免疫マップを作る取り組みはかなりのレベルで自己開示が要求される。

これを抵抗なく実施できる状況に自分はないなぁと感じた。

なので、チームでの実践は見おくりつつ、個人的な目標達成について考える際には免疫マップを作ってみようと思う。

免疫マップが向いている目標と向いていない目標というのもあり、資格取得しようといったような目標とは親和性が低いと感じる。どちらかといえば習慣的な目標達成についてどうしてもうまくいかない場合に免疫マップを作ってみると良いかもしれない。

自分の場合は筋トレを継続することがなかなかできていないので、筋トレ継続について免疫マップを作り、免疫を克服するように頑張ることでこの効果を実感できるかもしれないと思った。

読書しながらマインドマップを作った。

f:id:masamasah:20190106161339p:plain
なぜ人と組織は変われないのか

Sequence models & Attention mechanism

CouseraのDeeplearningコースの最終回. 長かった.

Various sequence to sequence architectures

Basic Models

センテンスの翻訳タスクを扱う基本的なモデルを図1に示す.

f:id:masamasah:20181015151629j:plain

このモデルはセンテンスtoセンテンスのタスクでよく使われる.

EncoderとDecoderの組み合わせは,センテンスtoセンテンスのタスク以外に,画像toセンテンスのタスクなんかでも使われる(図2).

f:id:masamasah:20181015151645j:plain

Picking the most likely sentence

LanguageModelを用いた文章生成では,各softmaxアウトプットの結果から,その確率に沿って単語をピックアップして,センテンスの生成を行っていた.

翻訳タスクにおいては,そうではなく,「一番確からしい」センテンスを得たい.

Greedy search

softmaxの値を参照し,初めの単語としてもっともそれらしいものを選択する. さらに,その結果を持って次の単語としてもっともそれらしいものを選択すると行ったように1つずつ単語を確定させていく方法をgreedy searchと呼ぶ.

これは,センテンスを文の先頭から見て決めて行くものであり,センテンス全体として確からしいものが得られにくいという課題がある.

これを解決するのが次章で説明するBeam Searchである.

Beam Search

Greedy Searchの問題を解消する.

簡単に述べると,選択肢をB個(ハイパーパラメータ)しながらセンテンスを最後まで形成し,その中で一番それらしいものを選ぶと行った方法である.

まず,センテンスの初めの単語としてふさわしいであろう単語をB個選択する. 次に,それぞれ選択されたB個が与えられた際の各単語の事後条件を求める.

その事後条件から,改めてB個を候補として記憶する.

さらに,それぞれのB個の単語の組み合わせが得られた際の,各単語の事後条件を求めて,TopB個を候補として記憶する.

センテンス終端文字が得られるまでこれを繰り返し,最終的に得られたB個の候補センテンスから,もっとも確からしいものを採用する.

これによって,初めに先頭単語を決めて,順番にその次の単語を決めて行く方法に比べて,全体を通してより確からしいセンテンスを選択することが可能になる.

Refinements to Beam Search

前述の方法を定式化すると図3のようになる.

f:id:masamasah:20181015151702j:plain

式を見るとわかるが,これをそのまま実施すると,短いセンテンスの方が有利になるという問題が起こる.

これを補正するために,翻訳語センテンスの長さTyを使った補正ずみの式を図4に示す.

f:id:masamasah:20181015151713j:plain

Error analysis in beam search

RNNでモデルを学習し,そのモデルから得られた確率を用いてBeamSearchでセンテンスを完成させる.

プロジェクトを進める上で,ボトルネックになっている箇所を見つけるために,ErrorAnalysisを実施する必要があり,ここではその方法を述べる.

方法は簡単で,以下の通り.

最終的に得られた翻訳結果y(微妙に間違っているもの)と人間が翻訳した正解翻訳結果yを考える. まず,RNNを用いてP(y|x)を求める.次に,P(y|x)を求める.

この結果,P(y|x)>P(y|x)であれば,RNNはyをより確からしい翻訳結果だと主張しているとみなせる.逆にP(y*|x)<P(y|x)であればRNNはyをより良い翻訳結果だと主張していることになる.

つまり,前者であればRNNは正しく翻訳を評価できているため,問題はRNNの後にセンテンスを整形してるBeamSearchのアルゴリズムにあると思われる.この場合はBの値を大きくして精度を高める必要があるかもしれない.

逆に後者であれば,RNNが正しく翻訳を評価できておらず,RNN側の性能改善が求められる.

以上がBeamSearchとRNNについてのErrorAnalysisの進め方である.

Attention Model Intuition

これまでのモデルでは,センテンスの翻訳を,翻訳元の文章全てを見てやってきた.

だが,長い翻訳元の文などについてこれを実施するのはあまり実用的ではない.

構造的に近しい箇所の翻訳元センテンスだけをみれば,正しい翻訳は実施できるからである.

ということで,全ての文章を見て判断するのではなく,翻訳済みセンテンスの1単語を決める際に,どの程度の範囲のinputの情報を参考にすれば良いか?ということをうまく調整してくれるのがAttention Modelである.

Attention Model

AttentionModelを図5に示す.

f:id:masamasah:20181015151727j:plain

α<t, t'>は,単語tを決定するのに,翻訳元のt'番目の単語をどの程度考慮すべきかと言った重みを示す.

Speech recognition

Speech recognition

音声認識システムでは,図6のようなモデルが使われる.

f:id:masamasah:20181015151739j:plain

ここで得られたttthh_ee_ qqq__みたいなアウトプットを整形して,"The quick brown fox"といった正解を導き出すことができる.

Trigger Word Detection

Alexaのようなトリガーする単語の検知システムも似たようなモデルになる. 図7にイメージを示す.

f:id:masamasah:20181015151757j:plain

こんな感じで,Many-to-Manyのアーキテクチャでトリガーワードが検知されたら1を返すようなスタイルになる.

Natural Language Processing & Word Embeddings

Introduction to Word Embeddings

CouseraのDeepLearningのコースの学習メモ. 今回は言語処理のためのモデルについて.

Word Representaion

Word Embeddingの方法は色々ある. 前週ではOne-hotなベクトル表現をみてきた.

One-hotな表現は,シンプルだが,有用性は低い.

例えば'I want a glass of orange juice.'というセンテンスを学習した上で,'I want a glass of apple ?.'の?を予測したい.

orangeとappleは似たような概念であり,文脈からもjuiceがきて欲しいが,単なるone-hotな表現ではorangeとappleが似た概念であることを表現できないため,難しい.

これを改良して,図1のように,特徴群に対する当てはまり度合いのようなものを定義してそのベクトルを扱うようにすると,似た者は似たようなベクトルになり,似ている概念を扱うことができるようになる.

f:id:masamasah:20181009220451j:plain

特徴は高次元であり,可視化に向かないが,2次元(もしくは3次元)に圧縮できる技術であるt-SNEを活用して可視化すると,図2のように似た者が近くに集まるようになる.

f:id:masamasah:20181009220540j:plain

Using word embeddings

どのように学習するかは後ほど学ぶが,Word Embeddingを活用する際には,転移学習の考え方が使える.

すでに大量のデータで学習された各単語のベクトル群がネット上にたくさんあるので,それを使って単語をベクトルにして,所望のタスクを解くといった方法が有用である.

Properties of word embeddings

One-hotな表現ではなく,前述のような表現方法を使うと,単語のアナロジーを解くことができる. どういうことかというと「Man->Womanの時,King->?」の?を予測することができる. 今,いくつかの特徴でベクトル化した各単語が図3のように与えられたとする.

f:id:masamasah:20181009220554j:plain

この時,[tex: e{man} - e{woman}]を求めると [-2, 0, 0, 0]となる. これが左辺の関係性となる.

[tex: e{king}-e{?}]がこれと等しくなるものを求めると, e_{queen}が一番確からしいことがわかる.

このようにしてアナロジーを解くことができるわけである.

定式化すると,図4で表せる.

f:id:masamasah:20181009220609j:plain

ここで Sim(u,v)は色々な種類があるが,コサイン距離やユークリッド距離が用いられる.

コサイン距離は図5のような値である.

f:id:masamasah:20181009220620j:plain

Embedding matrix

ボキャブラリーVに含まれる単語全てを,特徴次元Dでベクトル化したセットをEmbedding matrix(E)と呼ぶ(図6).

f:id:masamasah:20181009220630j:plain

Embedding matrixに単語αのOne-hotベクトルをかけると,単語αに対応するベクトル e_{\alpha}を取り出すことができる.

Learning Word Embeddings:Word2vec & GloVe

Learning word embeddings

Embedding matrixの学習の方法について.

いろんなアルゴリズムがあるが,近年はかなりこれがシンプルになってきている. シンプルすぎて,なぜそれがうまく動作するのかが直感的にわかりにくかったりもするので,まずはある程度の複雑さのあるアルゴリズムから始めて,よりシンプルなアルゴリズムでもうまく行くことを説明する.

(若干奇妙に思えるかもしれないが)Ebmedding matrixを学習するために,「単語を予測するタスク」を考える.

"I want a glass of orange ?."の?を予測する.

適当に初期化されたEを用いて図7のようなニューラルネットを構築する.

f:id:masamasah:20181009220643j:plain

出力層はボキャブラリー数分のsoftmaxになっており,?が正解データであるjuiceになるように w^{1} , b^{1}, w^{2}, b^{2},  Eを学習して更新する.

大量のテキストデータに対して同様の学習を行うことで,所望のEを得ることができるわけである.

ここで,予測したい位置(?の位置)に対して,入力とする部分のことをContextと呼ぶ.図7の例では,Contextは文全てだった.

このContextを,直近4単語とか,前後の4単語,直近1単語や,直近ではなくとも近くにある1単語とするようなスタイルがある.

最後の,直近ではなくとも近くにある1単語とする手法が,Skip-gramと呼ばれるものであり,次章で説明する.

Word2Vec

skip-gram

まず,skip-gramのタスクを説明する. skip-gramは,Contextからtargetを求めるタスクである.

教師データとして'I want a glass of orange juice to go along with my cereal.'というセンテンスが得られたとする.

まず,教師データからランダムにContextを1つピックアップする(例えばorangeとしよう).

次に,targetを選ぶが,targetはcontextから見て,N単語以内にある単語のうちの1つである.

このcontextとtargetを1組として扱い,contextの単語が得られた際にtargetの単語を推定するタスクがskip-gramである.

Model

モデルを図8に示す.

f:id:masamasah:20181009220658j:plain

contextの単語ベクトルをsoftmaxして,出てきた結果のなかでtargetとして出てきてほしい部分の値が大きくなるように学習する. この時,softmax関数は図9のように表せる.

f:id:masamasah:20181009220711j:plain

図9の通り,分母でボキャブラリー数だけ足し算する必要があり,計算コストがかなり高いという問題がある.これを解決するために次の賞ではNegative Samplingを説明する.

Negative Sampling

Negative Samplingでは,contextの単語と,wordが1つ与えられて,さらにwordがtargetかどうかを表すフラグが与えられる.

これら3つの情報をもとに学習を行う.

例えば,教師データとして'I want a glass of orange juice to go along with my cereal.'が与えられたとする.Contextとして適当に単語が選ばれる(orangeとする). この時,targetとして,contextに近い中からランダムに1つをピックアップする(juiceとする). これらを1ペアとして[context:orange, word:juice, isTarget:True]として扱う.

さらに,isTarget:Falseのデータを作り出す. Falseのデータは,contextは固定にして,ボキャブラリーの中から適当にピックアップする.例えばsmallがピックアップされれば[context:orange, word:small, isaTarget:False]となる. ランダムにピックアップすると例えば,教師データに含まれる単語が選ばれるケース(例えばglassとする)もある. この場合での気にせずにFlaseのサンプルとして扱う.

さらにcontextを変えて教師データ群を作り出す.

これらのデータを使って,図10のモデルを学習する.

f:id:masamasah:20181009220725j:plain

この時,ボキャブラリーから適当に作成されるFalseのデータは,contextのデータ1つに対して,教師データが十分に多ければ2~5個,少なければ5~20個程度にする.

Flaseのサンプルを適当に作って教師データとして学習を進めるのでNegative samplingと呼ぶ.

ボキャブラリー分のロジスティック回帰を計算することになるが,ボキャブラリー分のデータを使って毎回softmaxを計算するよりははるかに計算コストが低い.

GloVe word vectors

あまり多くは使われないがGloVeという手法もある. Global vectors for word representationの略.

 X_{ij} (単語iがコンテキストjのもとで出てきた回数)を考えるモデル.

図11を最小化するように学習を行う.

f:id:masamasah:20181009220740j:plain

この時の[tex: \theta{i}, e{j}]はシンメトリックな値であり同様の働きをする. なので,GloVeを行う際には,まず,それぞれをランダムに初期化し,学習を進めて最終的に[tex: e{w} = (e{w} + \theta_{w})/2]として平均値を用いる必要がある.

Applications using Word Embeggings

Word embeddingsを活用する例を紹介する.

Sentiment Classification

テキストからお気に入り度合いを5段階で分析するタスク.星の数を推測するようなもの. Word Embeddingを使うと,教師データが少なくても良い結果が得られる.

"The desert is excellent"で星4つの教師データが得られたとする. この時,図12のようにモデルを構築し,学習することができる.

f:id:masamasah:20181009220750j:plain

なお,ここで,Eは大量のコーパスで学習されたwordEmbeddingである.

各単語ベクトルを平均して扱う方法であり,これは単語の出現順序を考慮しないことによる問題がある. "Completely lacking in good taste, good service and good ambience."という酷評であっても,平均すると"good"が多いので,かなりポジティブに解釈されてしまう.

これを防ぐためにRNNのモデルを使った方法がある(図13).

f:id:masamasah:20181009220801j:plain

このようなモデルによって,かなり良い精度で星の数を推定することが可能になる.

Debiasing word embeddings

Embedding matrixは,当たり前だが,その学習に使ったコーパスのバイアスに含まれるバイアスを持ったまま学習される. 現状の様々な理由によって例えば"Engineer"という単語は"woman"よりも"man"に近いように学習されがち.

このような望まれないバイアスを是正する仕組みについて解説されている.

Recurrent Neural Networks

CouseraのDeepLearningのコースの講義メモ. 今週からSequence Modelsということで時系列データを扱う. 文章なんかもSequence Modelで扱う.

Why sequence models

RNNなどの時系列データを扱うためのモデルについて勉強する. 音声認識や楽曲生成,感情分析なんかがseruence modelのタスクとなる.

Notation

表記法について.

入力xとしてセンテンスを想定する. 入力x:「Harry Potter and Hermione Granger invented a new spell.」という感じのセンテンス.

この時,入力の要素をそれぞれx^{<1>},x^{<2>},x^{<3>},...,x^{<9>}と表す.一番後ろの要素は入力系列の長さを使ってx^{ \langle Tx \rangle }と表す.

出力が例えば各単語が人名であるか?のフラグだとすると 出力:「1 1 0 1 1 0 0 0 0」と表せる. これをy^{<1>},y^{<2>},y^{<3>},...,y^{<9>}と表す.

ニューラルネットに入力を入れる際に,Harryという文字列はそのまま扱うことができないので,ベクトルに変換する必要がある. このための方法はいろいろある.

例えば,ボキャブラリーVを次のように考える.

Voc = [a,...,and,...,Harry,...Potter,...zoo ]の転置

このボキャブラリーは入力の各要素が取りうる単語をひとまとめにしたベクトルであり,1番目が[a],4075番目にHarry,6023番目にPotter,100000番目にzooがくるとする.

この時,x^{<1>}は次のようになる.

x^{<1>} = [0,0,...0,1,0,....0]

ここで,4075番目の要素が1であり,ほかの要素は0である. これは1番目の入力要素であるHarryがVocの中で4075番目だからである.

同様に,2番目の入力であるPotterはVocの中で6023番目なので,6023番目が1で他は0のベクトルになる.

Recurrent Neural Network Model

なぜ通常のニューラルネットが使えないのか

これまでのネットワークではInputとOutputのサイズが一定であることが前提だった.これが,センテンスや音声を入力とすると可変長になるため,これまでの仕組みでは扱えない.

さらに,とある箇所で学習した内容を他の箇所に使い回すことができないという問題もある.文の先頭にHarryがきていたら人名として認識されるのであれば,文の途中にHarryがきた場合でも同様に認識してほしいが,普通のニューラルネットワークではこれはできない(CNNであればこれは可能だが).

RNN

RNNのアーキテクチャを図1に示す.

f:id:masamasah:20181003212134j:plain

ここで,縦長の箇所がニューラルネットワークであり,重みを共有した同じネットワークを常に使用する.

ここでポイントになるのが,\hat{y}^{<2>}の予測にx^{<2>}だけでなくa^{<1>}も使うことが大きな特徴である.

これによって現在より昔のデータを加味した推定を行うことができるようになる.

順伝播の計算式を図2に示す.

f:id:masamasah:20181003212147j:plain

これを簡略化し,図3となる.

f:id:masamasah:20181003212159j:plain

Backpropagation through time

各重みの学習はこれまで同様に誤差逆伝播で行う.

誤差は図4で表される.

f:id:masamasah:20181003212209j:plain

この誤差を,逆伝搬するので,図5のようなイメージになる. 赤字が逆伝搬を示している.最終的な誤差から,逆方向に伝搬していく様子がわかる.

f:id:masamasah:20181003212304j:plain

Different types of RNNs

これまでは入力と出力の要素数が等しい例をみてきた. これをMany-to-manyのパターンと呼ぶ.

他にも,Many-to-oneのパターンやOne-to-manyのパターン,Many-to-manyのパターンの亜種がある(図6).

f:id:masamasah:20181003212218j:plain

  • Many-to-many Tx=Tyのパターン.単語の人名判定などに使われる.

  • Many-to-one Ty=1のパターン.センテンスから感情を分析したりするなどに使われる.

  • One-to-many Tx=1もしくは0のパターン.楽譜の自動生成とかに使われる.

  • Many-to-manyの亜種 Tx!=Tyだがそれぞれが1ではないようなパターン.言語の翻訳とかに使われる.

Language model and sequence generation

言語モデルとは

音声認識のタスクにおいて「The apple and pear salad.」という発話が会った時,①「The apple and pear salad.」なのか,②「The apple and pair salad.」なのか,音声からだと判断が難しい.

この時,言語の特性上①である確率が②である確率より高いので,①を採用すべきだということをやるために,確率P(センテンス)を求めることができるモデルを言語モデルという.

対象とする言語の大量のコーパスを用いてモデルを学習させる.

RNNを用いる

確率P(センテンス)はP(x^{ \langle 1 \rangle }) \times P(x^{ \langle 2 \rangle }|x^{ \langle 1 \rangle })\times P(x^{ \langle 3 \rangle }|x^{ \langle 1 \rangle },x^{ \langle 2 \rangle }) \times ... \times P(x^{ \langle T_x \rangle }|x^{ \langle 1 \rangle },x^{ \langle 2 \rangle },...,,x^{ \langle T_{x}-1 \rangle })で求められる.

Many-to-manyモデルで,各値が求まるモデルを考える(図7).

P(Harry Potter and Hermione Granger invented a new spell.)を求める.

f:id:masamasah:20181003212319j:plain

ここで,y^{<1>}は,全てのボキャブラリに対して,センテンスが各単語で始まる確率をとなる.y^{<1>}の単語「I」に相当する部分は他のものに比べて高い確率を示すだろう.「Harry」に相当する部分は逆にそんなに大きくはないかもしれない.

次に,x^{<2>}=Harryとして,Harryが与えられた時のボキャブラリVの各単語の確率を求める. これを最後まで繰り返すことで,各単語の出現確率が求まり,それらを掛け合わせることでP(センテンス)が求まるわけである.

Sampling novel sequences

学習した言語モデルを使って,センテンスの生成ができる.

学習したRNNから得られた\hat{y}^{<1>}の確率分布に従って,1単語を選び出す. その単語をx^{<2>}として入力し,\hat{y}^{<2>}を得る.さらにそこから\hat{y}^{<2>}に従って単語を選び出してx^{<3>}に入力していく.ピックアプした結果が文の終端文字であるところまで進めると,最終的にセンテンスを生成できるわけである(図8).

f:id:masamasah:20181003212328j:plain

Vanishing gradients with RNNs

RNNは系列が増えるに従ってどんどん深いネットワークになっていくので,勾配消失問題と勾配爆発問題が起きる. 勾配爆発の方は,勾配が閾値を超えたら調整するGradientClippingという技術を使うことでなんとかなるが,消失問題はそうもいかない.

これが起きると,RNNにおいては,時系列的に離れた情報は影響を及ぼしにくいという状態が起こる.

例えば「The cat which .... was full.」という文章の動詞部分は主語のcatが単数か複数かで異なる.主語が複数であれば「The cats which ... were full.」となるべきである.

これが,勾配消失問題により,離れた情報は影響を及ぼしにくいため,解決できない.

Gated Recurrent Unit

勾配消失問題を解決するためのRNNのシリーズとしてGated Recurrent Unit(GRU)とLong Short Term Memory(LSTM)がある. まずGRUについて説明する.

通常のRNNを細かく図示すると図9のようなイメージになる.

f:id:masamasah:20181003212339j:plain

GRUとLSTMでは,メモリーセルcというものを考える. GRUではメモリーセルc^{ \langle t \rangle }=a^{ \langle t \rangle }である.

GRUの単純化したモデルについてまずは説明する.

メモリセルを導入した順伝搬を図10に示す.

f:id:masamasah:20181003212350j:plain

ここで,Γはゲート関数と呼ばれる.

ゲート関数が1であれば c^{\langle t \rangle}=\widetilde{c}^{\langle t \rangle}となる. ゲート関数が0であれば c^{\langle t \rangle}=c^{ \langle t-1 \rangle}となり,メモリセルは更新されない. つまり,ゲート関数がメモリーセルに格納されている過去の情報を更新するか,保持するかを制御するような動きになる.

言い換えると,ゲート関数が0であれば記憶を保持し,1であれば過去の情報は忘れて新たな情報を記憶し直すということになる.

ここで,単純化したGRUのイメージを図11に示す.

f:id:masamasah:20181003212359j:plain

「The cat which .... was full.」の例で言うならば,catの時点でゲート関数が1になり現在の情報を記憶して,主語が単数形であったことを記憶し続ける.wasの直前まで主語についての記憶があるので,間違いなくwas(wereではなく)を予測できるわけである.

これはあくまで単純化したもので,実際にの順伝搬は図12のようになる. ゲート関数が1つ増えている.

f:id:masamasah:20181003212409j:plain

たくさんの研究者が試した結果,ゲート関数をもう一つ増やしたほうが精度が高かったため,こんな形に落ち着いた.

Long Short Term Memory

LSTMという手法の紹介. GRUとLSTMでどっち使うべき?というのは一概には言えない. LSTMの方が良いケースが歴史的には多いようだ.

なので,まずはLSTMを使ってみることがオススメ.ただ,GRUの方がシンプルではあるので,学習しやすいという利点がある.それによってより深い構造を取ることができたりもする.

LSTMの順伝搬を図13に示す.

f:id:masamasah:20181003212422j:plain

この場合のイメージを図14に示す.

f:id:masamasah:20181003212433j:plain

ΓuをupdateGate,ΓfをforgetGate,ΓoをoutputGateと呼ぶ.

Bidirectional RNN

これまでの枠組みでは,「過去のデータ」のみに依存していた. センテンス「He said, "Teddy bears are on sale!"」と「He said, "Teddy Roosevelt was a great President!"」の人名判断をしようとした時,過去のデータのみなので「He said」に従って「Teddy」を判定しなくてはいけない.これは不可能である.

なので,図15のような未来の情報にも依存するようなRNNも考案されている.

f:id:masamasah:20181003212445j:plain

この時,順伝搬は図16のように表せる.これをBidirectionalなネットワークと呼ぶ.

f:id:masamasah:20181003212455j:plain

これは通常のRNNの例だが,LSTMやGRUでも同様にBidirectionalなネットワークにできる.

Deep RNNs

これまで単層のRNNをみてきた. これらを縦に並べてDeepなネットワークを構築することが可能.

RNNやLSTMやGRUやBindirectionalRNNでも同様に積み重ねることができる. BindirectionalRNNは計算コストが高いのであまり深いのはみないが,可能は可能である.