いぬいぬいぬい

逆から読んでみてください

論文のIntroを淡々と和訳する - 1. TopicRNN: A Recurrent Neural Network with Long-Range Semantic Dependency

第一回目は以下の論文を和訳していきます。

 

TopicRNN: A Recurrent Neural Network with Long-Range Semantic Dependency

著者: A.B.Dieng (Columbia Univ.), C.Wang (MS research), J.Gao (MS research), J.Paisley (Columbia Univ.)

ICLR 2017

 

文書を読む際、短いにしろ長いにしろ、人間はそれまで読んだものの要点を覚えることが何かしらの方法でできるような機構を持っている。

(引用文章略)

上の文章の中で抜けている単語は「大統領」か「最高司令官」かその類義語であることは誰でも容易に予測できる。

観測された単語の列から後の単語を正しく予測するこの問題を解くために単純なn-gramから最新のRNNに基づく言語モデルまで、多くの言語モデルがある。

 

良い言語モデルは、少なくとも2つの自然言語の重要な性質を捉える必要がある。

一つ目は、正しい構文である。

この性質を満たすような予測をするためには、しばしば前の数単語を考慮するだけで十分だ。

したがって、正しい構文はより局所的な性質である。

単語の順がこの場合重要になる。

二つ目の性質は、予測の意味的な一貫性である。

これを達成するために、しばしば多くの前の単語を考慮し文章や文書の大域的な意味を理解する必要がある。

この場合には単語の順は通常それほど重要ではなくなる。

 

伝統的なn-gramや確率的なニューラル言語モデルは、固定された長さの前の単語しか考慮しないため、大域的な意味情報を捉えることが困難である。

これを克服するため、RNNを基にした言語モデルは単語の列の経緯を「覚える」ように隠れ層を用いた。

しかし、どのアプローチも明示的に上に述べた二つの言語の性質、正しい構文と意味の一貫性をモデル化していない。

Chelba-Jelinek(2000)やGao et al.(2004)の以前の研究は、言語における長期依存性を捉えるために構文的あるいは意味的なパーサーを利用した。

 

本論文では、隠れトピックによって直接意味的な長期依存性を捉えるように作ったRNN-basedなモデルTopicRNNを提案する。

このトピックはRNNに文脈を与える。

文脈をもつRNNは大きな注目を集めてきた。

しかし、我々のモデルに最も近いモデルはMikalov-Zweig(2012)の提案した文脈をもつRNNモデルと、そのLSTMへの最近の拡張である。

これらのモデルは学習済みのトピックモデル特徴量を隠れ層(またはRNNの出力)への追加の入力として用いた。

それに比べ、TopicRNNは学習済みモデル特徴量を必要とせず、end-to-endのやり方で学習できる。

topic modelが通常扱うのに困難が生じるstop wordsを自動的に扱うための方法を導入する。

同等のモデルサイズの設定のもとで、TopicRNNはPenn TreeBankデータセットでMikolov-Zweigの文脈をもつRNNよりも良いperplexityスコアを達成した。

さらに、TopicRNNは教師なし下流での応用のための特徴抽出機としても用いることができる。

例えば、感情分類のためにTopicRNNを使ってIMDB映画レビューデータセットの文書特徴量を引き出した。

誤差6.28%を記録した。

特徴抽出の段階でラベルや敵対学習を用いないにも関わらず、これは最先端の5.91%に近い。

 

 

おしまい

機械学習の論文のIntroを淡々と和訳する - 0. 宣言

とても久しぶりの投稿になります。

 

前の記事までで読んでた本は、その後もちょこちょこ読んではいましたがアウトプットは三日坊主となってしまいました。

 

 

今は仕事上色々機械学習の勉強をしていて、論文をもっと読んでいかないとなという状態です。

 

そこでこれからは、

「気になった論文のIntroductionを和訳する」

というのをやっていくことにします。

 

今時、手法の説明とかはQiitaとか見ればいくらでも見つかるので、

ここでは著者の問題意識とかに注意を向けて読めればいいかなと思っています。

 

淡々と和訳していくスタイルにして、

ある程度コンスタントに更新していきたいです。

 

ジャンルは、深層学習とくにRecurrent Neural Networkに興味を持っているのでそのあたりがメインになると思います。

データサイエンティスト育成講座(4)

こんにちは。

 

かなり期間が空いてしまいましたが、

今回も前回に続いて「データサイエンティスト育成講座」を読み進めていきます。

 

今回は第6章「Pandasを使ったデータ加工処理」です。

 

機械学習の勉強はほかの本でやってましたが、

実際にデータ分析をするためにいろいろデータをいじるということはしたことがないので、

学ぶことの多そうな章かなという印象でしたが、さてさて…

 

 

PandasのDataFrameを使ってやっていきます。

DataFrameは辞書型データを受け取ってできるクラスなのかな?

この本はとりあえず写経をしてみてどんなことができるかがなんとなくわかるように書かれているみたいで、

何が何の型なのかとかが書いてなくてすこしモヤモヤします。

まぁそうやって興味を持った時点でこの本の目標は達成してるってことなのかもしれません。

気になったら各自もっと調べろというスタンスっぽい。

 

まずはインデックスに関する基本的な操作。

各インデックスごとの集計とか、削除とか。

 

続いてデータの結合の仕方。

ここらへんは例を見れば何やってるかわかりやすいです。

 

その後出てくるマッピング処理ってやつなんですが、

df1['up_two_num'] = df1['birth_year'].map(lambda x: str(x)[:3])

みたいにすると'birth_year'の上3桁を取り出した'up_two_num'というが加わるとのこと。

この直前にはmapには辞書型データを与えて対応を作っていたけど、無名関数も入れられるんですね。

おもろい。

 

そのあとのgroupbyメソッドを使ったデータの集約の演習問題やってるときに思ったんですが、

出力が表になるときとならないときはどう違うんでしょ?

そのデータ型とかも違うのかな?なんで違う表示のされ方するんかな?

たとえば、実際に問題の中で使われてるデータでいうと、

学校と性別ごとにG1期の数学の点数の平均を出すと、

student_data_math.groupby(['school','sex'])['G1'].mean()

 
Out[5]:
school  sex
GP      F      10.579235
        M      11.337349
MS      F      10.920000
        M      10.380952
Name: G1, dtype: float64

となりますが、G1期からG3期までの各平均点を出すと、

student_data_math.groupby(['school','sex'])['G1','G2','G3'].mean()

    G1 G2 G3
school sex      
GP F 10.579235 10.398907 9.972678
M 11.337349 11.204819 11.060241
MS F 10.920000 10.320000 9.920000
M 10.380952 10.047619 9.761905

 

って出力されるんですよねー

まぁライブラリの中身を読めばわかるんでしょうが…

 

と思ったら、解答の方に書いてあって、

上はSeries型、下はDataFrame型らしいです。

ふーん。

 

欠損データの扱い方、時系列データの扱い方などと続きますが、

この章はとりあえず読むだけ読んで、後で必要になったときにコマンドを見に戻ってくる方がよさそうですね(いまさら)

 

てなわけで今回は終わりにしまーす。

 

 

データサイエンティスト育成講座(3)

こんにちは、いぬいです。

 

前回に引き続き、

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

 

この本を手を動かして読んでいきます。

 

 3章まで終わったので、4章「確立と統計の基礎」から。

 

 

読んでみたところ、本当に基礎を書いてあるので、

大学1年のときに統計の講義を受けたことがある人ならばパラパラ見て復習するか読み飛ばしてよいです。

一つだけ、ビッグデータ分析の場合には統計的検定を行うと検出力が大きくなる(p値が小さくなる)ので有意な結果が出やすいというのは、ほう、となりました。

 

というわけで5章「pythonによる科学計算(NumpyとScipy)」に進みます。

2章で学んだ基礎に続き、データ分析で用いるNumpyやScipyといったライブラリでの計算のしかたを学びます。

 

ところでNumpyはナンピィと読むと思っていて周りの人がみんなナンパイというのでそうなのかと思いましたが、

Scipyもサイパイと読むのでしょうか?

なんというか、語呂が微妙に聞こえるんですが…笑

 

閑話休題

 

numpyの方は、最近深層学習の勉強とかでも使ってたのでパラパラ見ながらふんふんと読みました。

broadcastとか、numpy特有の計算ルールなど書いてあります。

 

scipyの方ですが、

まず補間について。

与えられた数列から、その間を埋める連続関数を与える補間計算です。

scipyからinterpolateをインポートして、

interp1dメソッドで補間する関数を得ます。

本を読んだとき、interpl(エル)dだと思って書いたらエラーが出ましたf(^_^;)

p1dってなんのことなんでしょう?

 

パラメータに'linear'や'cubic'を指定することで線形や三次曲線での補間が得られます。

 

それから行列の分解の話に入っていきますが、

特異値分解の項で、

m×n行列Aに対して「AA*の固有値はmin(m,n)であり」

「AA*の固有値の個数はmin(m,n)であり」

の誤植でしょうね。

 

ほかにもLU分解やコレスキー分解を求めるコマンドを説明しています。

数学的な部分の説明は本当に最小限にして、どんなことに役立つかもひとことだけ書いてあって行列分解の節は終わりです。

 

僕もよく知らなかったので、少しだけ理論的な部分を補足しておきます。

と思ったんですが、

特異値分解のことまとめるのに結構準備が必要なことが分かったのでとりあえず保留…

ちゃんといろいろ示すのって面倒っぽいですね。

 

(今度ちゃんと有言実行したいなぁ…)

 

scipyを使った積分なり最適化は、もう書いてある通りだからいっか。

微分方程式解けるっていうのはいいですね。

カオス理論で有名らしいローレンツ方程式の解の可視化された図が載っていておもしろかったです。

 

次回はPandasでのデータ加工処理です。

こういうのの方が自分には勉強になりそう。

データサイエンティスト育成講座(2)

前回の続きです。

今回は第3章「記述統計と単回帰分析」を読んで、以下を行いました。

 

まずは準備として分析するデータをダウンロードし、PandasのDataFrameで読み込んでおきます。

 

「記述統計」というのは、

集めたデータを整理して見やすくし、特徴をつかむ方法のことだそうです。

 

Pandasのdescribeメソッドを使うと、平均・中央値・分散などが一気に計算されて表になるのでとても便利です。

(要約統計量というらしい)

  age Medu Fedu traveltime studytime failures famrel freetime goout Dalc Walc health absences G1 G2 G3
count 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000 395.000000
mean 16.696203 2.749367 2.521519 1.448101 2.035443 0.334177 3.944304 3.235443 3.108861 1.481013 2.291139 3.554430 5.708861 10.908861 10.713924 10.415190
std 1.276043 1.094735 1.088201 0.697505 0.839240 0.743651 0.896659 0.998862 1.113278 0.890741 1.287897 1.390303 8.003096 3.319195 3.761505 4.581443
min 15.000000 0.000000 0.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.000000 3.000000 0.000000 0.000000
25% 16.000000 2.000000 2.000000 1.000000 1.000000 0.000000 4.000000 3.000000 2.000000 1.000000 1.000000 3.000000 0.000000 8.000000 9.000000 8.000000
50% 17.000000 3.000000 2.000000 1.000000 2.000000 0.000000 4.000000 3.000000 3.000000 1.000000 2.000000 4.000000 4.000000 11.000000 11.000000 11.000000
75% 18.000000 4.000000 3.000000 2.000000 2.000000 0.000000 5.000000 4.000000 4.000000 2.000000 3.000000 5.000000 8.000000 13.000000 13.000000 14.000000
max 22.000000 4.000000 4.000000 4.000000 4.000000 3.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 75.000000 19.000000 19.000000 20.000000

こんな感じで見れます。

ところで私は今、jupyterからはてブロにそのまま表をコピペしてきれいに表示されることにモーレツに感動しています。 

 

…あとは変動係数とか散布図・相関係数、単回帰分析などの計算の仕方。

このへんはモノ自体はよく知ってるので、コマンドが勝手に打てるようになるくらいまで練習したいですね。

箱ひげ図は初めて知りました。

勝手に異常値を識別してくれるんですね。(多分)

 

そのために後日章末の総合問題を繰り返し解いてみることにします。

(やったら追記で書きます)

 

では。

 

 5/9追記

総合問題やってみました。

3-1 統計の基礎と可視化

ワインの質を表すデータをダウンロードし、要約統計量と各データの相関を可視化する問題です。

pandas.read.csvで読み込み、describeメソッドで要約統計量を、searborn.pairplotで相関図を出力させます。

 

f:id:bocat32:20190509072223p:plain

ワインの質のデータの相関図

データの項目は上から(左から)順に

酒石酸濃度、酢酸濃度、クエン酸濃度、残留糖濃度、塩化物濃度、有利亜硫酸濃度、亜硫酸濃度、密度、pH、硫酸塩濃度、アルコール度数、quality(総合的な品質)

 

…度数とquality以外はそのデータの持つ意味がわからん

酸たちの濃度は酸っぱさ・苦さ・渋さとかに関わって残留糖濃度は甘さに関わるのかな?

 

グラフからは、例えば

・酒石酸濃度と密度が正の相関にあること(なぜか?)

・酒石酸濃度とpHが負の相関にあること(酸性が強くなるほどpHは0に近づく)

が読み取れます。

酢酸はどうしてpHとの相関が見えないのかしら。

あと、一番重要なqualityと相関を持ってそうな因子があまりはっきりとは出てきません。

scipy.stats.pearsonrで一つずつ調べたところ(一気にできるのかな)一番相関が強いのは、

アルコール度数 (相関係数: 0.476、p値: 2.83e-91)

一番負に強いのが、

酢酸係数 (相関係数: -0.391、p値: 2.05e-59)

となりました。

http://advanced-brewing.com/U-ken/memo_01_acid_fruit.html

によると、酢酸は発酵中に酵母が作ったり、酢酸菌がアルコールを酢酸に変化させたりしてできるらしい。

あの酸っぱい味や香りも強くなってしまうからqualityが下がるのでしょう。

 

3-2 ローレンツ曲線とジニ係数

本文中で用いていた数学の成績データを用いて、不平等さを測るジニ係数を男女それぞれで計算する問題。

(東大の入学式の上野千鶴子さんの式辞で話題になった問題を想起させますが)

ローレンツ曲線がこんな感じ。 

f:id:bocat32:20190509075524p:plain

G1期の数学の成績のローレンツ曲線(男:M,女:F)と45度線(E)

ほとんど重なってて男女の差は見えないですが。

45度線(E)とローレンツ曲線に囲まれる部分の面積の2倍がジニ係数です。

面積といっても、計算は与えられたデータから簡単にできます。

(解答例のコードを見ると和を取った後2倍していて、一見計算式とズレているように見えますが、これはforでiとjが動く範囲が計算式のそれのちょうど半分になっているからです)

それで求めたジニ係数がこちら。

男性のジニ係数: 0.1719735
女性のジニ係数: 0.1723783

 

というわけで、演習問題でした~

データサイエンティスト育成講座(1)

こんばんは。

 

ブログを書くのは一年ぶりとなりました。

 

いろいろあった一年でした…(遠い目

 

はい、そんなわけで。

新年度が始まりまして、

これから仕事で機械学習に触れることになりました。

 

そいでちょいちょい勉強していたのですが、

今日本を読んで実装してみたり勉強したことまとめられているブログを読んでいて、

 

「あー、こういうアウトプットしておくの楽しそうだしスキルアップにも役立ちそうだしいいなぁ」

 

と思い、

思い立ったが吉日。

 

ということで、ブログを勉強日記として再開することにいたしました。

まぁ気負わずのんびりとね。

 

読む本は、つい先月発売されたこちらです。

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

 

 

データ分析勉強しなきゃ!

と言ってわざわざ予約して買ったのに、

年度末でバタバタしていてほとんど開きもしなかったという。

 

 

とりあえず家で勉強する時間が取れ始めたので、やっていきます。

ブログで公開するような役に立つことなんて書けはしないんですが、

まぁこの新しい本についてブログ書いてる人ってのもまだあまりいなさそうだし、

この本に興味のある人の目に留まることでもあればいいかなと。

 

さて、第1章「本書の概要とpythonの基礎」から入り、

本を読み進めていくのに必要なJupiter Notebookなどの環境構築を

先週末、ようやく行って読み進める準備ができたところでした。

(PCのアカウントを日本語で作ってしまったがために、Anacondaをインストールする際のパスの設定に問題が生じて一苦労でした。始める前にもうやめようかと思った)

 

で、今日は

第2章「科学計算、データ加工、グラフ描画ライブラリの使い方の基礎」

を進めています。

 

具体的には、

Numpy

Scipy

Pandas

Matplotlib

を、初めての人にもわかりやすく使い方を解説するという内容。

 

Numpyは以前CourseraでAndrew Ng先生の深層学習の講座を受けた際に触って、

Matplotlibはほんの少し遊んだことがある程度ですが、

 

ScipyとPandasは名前しか知らない。

 

けど本当に基本的なところだけやってるのでさらっと読めました。

 

Pandasでデータが勝手に綺麗な表になって出力されたのはちょっと感動しました(小並

 

今日はこのへんで。

遠出と後悔

お久しぶりです。

 

これから新幹線に乗って母の実家に向かいます。

なんかとてもバタバタしてしまったのですが、なんとかホームに着いて新幹線を待っています。

 

何でバタバタしちゃったかって話なんですが、

 

時間を有効に使おうと思うあまり、予定を詰めてギリギリの日程にしてしまうこと、

みなさんもありますよね。

 

 

僕もそれで、勢い余って今日の午前に予定を入れてしまい、遠出するのに荷造りが不十分かつ時間がタイトな状況を作り出してしまい…

 

こういうときって、あとから

「あれ持ってくれば良かった」

「あれやっとくんだった」

とかってどんどん出てくるんですよね。

 

今まさにいくつかそれが脳に浮かんでいるわけですが、今度同じミスをしないように書き留めておきます。

っていってもいつも同じようなミスしてるんですけどね。

読んでる方は「あるある!」とか「アホか!」と思いながら読んでください

 

では参ります。

 

・鍵かけ忘れた…?

まぁ、これは多分大丈夫なはずなんですよ。

習慣化してるので。

ただ閉めた記憶もないんですよ。

習慣化してるので。

 

・コート

持ってくれば良かったですかね~

この時期難しいですよね。

特に僕が家を出たときは暑いくらいだったんですが、

新幹線のホームは寒いです。

ナイロンのパーカーだけ持ってるので羽織ってますが

 

・マスク

これも季節柄ですね。

多分母の実家にもあるとはおもうのですが

 

・スーツケース

これが一番痛手かもしれません。

まぁ不慮の事故だったのですが…

 

順を追って話すと、

荷物を遠出用のスポーツバッグに詰めて一応時間通りに家を出られて、

駅まで小走りで向かっていたところ、

 

バキッ!!

 

と鳴って、急に肩が軽くなりました。

そう…

肩掛けのベルトが壊れてしまったのです…

 

帰って荷物を詰め直すほどの時間もなさそうで、しょうがないので持ち手を持って運んでますが、帰りを思うとげんなりします。

 

家にまだほとんど使ってないスーツケースがあったので、それで来るべきだった…

 

・本

これも結構大きいですよねー

暇つぶし用の本を荷物に入れなきゃと思ってたのですが、

バタバタしてたら新幹線の駅まで着いたときに

「あっ…」

てなりました。

まぁ暇つぶしできるものはいくらかありますが、本当に時間をつぶすだけのスマホアプリをするくらいなら、本を一冊読みたいっていうのはあるんですよね

図書カードあるし向こうで買うかもしれません。

 

 

そんなところでしょうか。

思い出したらまた書きます。

 

では行ってきますノシ