ゼロから作るDeep Learning 3章 ニューラルネットワーク
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
前回はゼロから作るDeep Learning 2章 パーセプトロン - n3104のブログです。
最近やっと5章まで読み終わりました。前回からだいぶ時間が空いてしまいましたが3章のメモをブログにしました。ついに実際に予測します。といっても学習済みのモデルを使いますけどもw
- 3.1.3 活性化関数の登場
- 図 3 - 4 活性化関数によるプロセスを明示的に図示する
- すごい分かりやすい!
- “「パーセプトロン」という言葉が指すアルゴリズムは、本書では厳密な統一がな されずに使われています。一般的に、「単純パーセプトロン」といえば、それは 単層のネットワークで、活性化関数にステップ関数(閾値を境にして出力が切り 替わる関数)を使用したモデルを指します。「多層パーセプトロン」というと、 それはニューラルネットワーク――多層で、シグモイド関数などの滑らかな活 性化関数を使用するネットワーク――を指すのが一般的です。 ”
- なるほど。
- 図 3 - 4 活性化関数によるプロセスを明示的に図示する
- 3.2 活性化関数
- “つまり、活性化 関数の候補としてたくさんある関数の中で、パーセプトロンは「ステップ関数」を採 用しているのです。パーセプトロンでは活性化関数にステップ関数を用いているなら ば、活性化関数にステップ関数以外の関数を使ったらどうなるのでしょうか? 実は、 活性化関数をステップ関数から別の関数に変更することで、ニューラルネットワーク の世界へと進むことができるのです! ”
- なるほど。この本は概念の説明が丁寧で分かりやすいなー。
- “つまり、活性化 関数の候補としてたくさんある関数の中で、パーセプトロンは「ステップ関数」を採 用しているのです。パーセプトロンでは活性化関数にステップ関数を用いているなら ば、活性化関数にステップ関数以外の関数を使ったらどうなるのでしょうか? 実は、 活性化関数をステップ関数から別の関数に変更することで、ニューラルネットワーク の世界へと進むことができるのです! ”
- 3.2.3 ステップ関数のグラフ
- plt.ylim(-0.1, 1.1) を指定しないとy軸が0-1となり、グラフがただの直線になってしまうw なので、上下に余分に 0.1 ずつ広いy軸にしている模様。
- 3.2.4 シグモイド関数の実装
- “シグモイド関数の実装が NumPy 配列に対応していることは、NumPy のブロー ドキャストに秘密があります(詳しくは「1.5.5 ブロードキャスト」を参照)。ブロー ドキャストの機能により、スカラ値と NumPy 配列での演算が行われると、スカラ値 と NumPy 配列の各要素どうしで演算が行われます。”
- NumPy便利!
- “シグモイド関数の実装が NumPy 配列に対応していることは、NumPy のブロー ドキャストに秘密があります(詳しくは「1.5.5 ブロードキャスト」を参照)。ブロー ドキャストの機能により、スカラ値と NumPy 配列での演算が行われると、スカラ値 と NumPy 配列の各要素どうしで演算が行われます。”
- 3.2.5 シグモイド関数とステップ関数の比較
- こういうことを説明することにとても好感を覚える。概念を説明しようとしていることが伝わってくる。
- 3.2.6 非線形関数
- “活性化関数の説明では、「非線形関数」「線形関数」という用語がよく登場しま す。そもそも関数は、何かの値を入力すれば何かの値を返す「変換器」です。 この変換器に何か入力したとき、出力が入力の定数倍になるような関数を線形 関数と言います(数式で表すと h(x) = cx。c は定数)。そのため、線形関数 はまっすぐな 1 本の直線になります。一方、非線形関数は、読んで字のごとく (「線形関数に非ず」)、線形関数のように単純な 1 本の直線ではない関数を指し ます。”
- 分かりやすい。
- “なぜ線形関数を用いてはならないのでしょうか。それは、線形関数を用いると、 ニューラルネットワークで層を深くすることの意味がなくなってしまうからです。 ”
- ここ、同じように非線形関数の場合で説明が欲しい。y(x) = c × c × c × x とあるが、c が異なる定数の場合はどうなる?
- “活性化関数の説明では、「非線形関数」「線形関数」という用語がよく登場しま す。そもそも関数は、何かの値を入力すれば何かの値を返す「変換器」です。 この変換器に何か入力したとき、出力が入力の定数倍になるような関数を線形 関数と言います(数式で表すと h(x) = cx。c は定数)。そのため、線形関数 はまっすぐな 1 本の直線になります。一方、非線形関数は、読んで字のごとく (「線形関数に非ず」)、線形関数のように単純な 1 本の直線ではない関数を指し ます。”
- 3.3.3 ニューラルネットワークの内積
- あくまでの出力は行ベクトルで、ノードは行列になるのか。
- 3.4 3 層ニューラルネットワークの実装
- ここも分かりやすいなー。各層の入力と活性化関数の分けて記述し、活性化関数の隠れ層と出力層での役割の違いについても明記していて、概念の共通点と差分が把握しやすい。
- バイアス項ってノード毎に違うんっだっけ? ← 違う。ノード毎に学習する。
- 3.5.1 恒等関数とソフトマックス関数
- 恒等関数の場合はノードって1つにするのかな?複数ある場合、どれを採用すればいいかわからないよね。画像みたいにそれぞれの要素をビットマップの各インデックスや色に対応させてるなら別だけど。
- 3.5.2 ソフトマックス関数の実装上の注意
- なるほどなー。式変換てほんと重要だなー。
- 3.5.3 ソフトマックス関数の特徴
- “また、ソフトマックス関数の出力の総和は 1 になります。さて、この総和が 1 になるという性質ですが、これはソフトマックス関数の重要な性質です。この性質の おかげでソフトマックス関数の出力を「確率」として解釈することができます。”
- 実際に確率であるわけではなくて、確率であるとみなすが正しい?
- “ニューラルネットワークのクラス分類では、一般的に、出力の一番大きいニューロ ンに相当するクラスだけを認識結果とします。そして、ソフトマックス関数を適用し ても、出力の一番大きいニューロンの場所は変わりません。そのため、ニューラル ネットワークが分類を行う際には、出力層のソフトマックス関数を省略することがで きます。実際の問題では、指数関数の計算は、それなりにコンピュータの計算が必要になるので、出力層のソフトマックス関数は省略するのが一般的です。”
- そーなんだ!確かに分類したいだけなら数値要らないしなー。
- “また、ソフトマックス関数の出力の総和は 1 になります。さて、この総和が 1 になるという性質ですが、これはソフトマックス関数の重要な性質です。この性質の おかげでソフトマックス関数の出力を「確率」として解釈することができます。”
- 3.6.1 MNIST データセット
- mnist.py
- pickle
- PIL (Python Imaging Library)
- http://www.lifewithpython.com/2013/09/pil.html
- PILが利用できなかったため Pillow をrequirements.txtに追加してインストールした。
- https://pypi.python.org/pypi/Pillow/2.2.1
- http://qiita.com/7280ayubihs/items/13486f7689dc50480949
- pip で入れる場合は Pillow を使うらしい。
- 3.6.2 ニューラルネットワークの推論処理
- 学習済みのモデルを使うのであまり実感はわかないかも。でも、最終形を先に示すという意味ではいいのかも。
- 3.6.3 バッチ処理
- NumPyの素晴らしさが分かってきた。これは便利だなー。
個人的には活性化関数を明示してるのが分かりやすいなーと思いました。Python機械学習プログラミング 達人データサイエンティストによる理論と実践 impress top gearシリーズで単純パーセプトロンを読んだ際はよくわからなかったので。ただ、5章 誤差逆伝播法 まで読むとニューラルネットワークでは活性化関数は意識するの当然なんだと思ったりもしました。そもそも活性化関数レイヤとして実装するので。
悪いヤツほど出世する
- 作者: ジェフリー・フェファー,村井章子
- 出版社/メーカー: 日本経済新聞出版社
- 発売日: 2016/06/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
なんとなくネットで見かけて、アマゾンの説明とレビューが良さげだったので読んでみました。レビューの通りで「なるほどねー」とか「そうだよねー」と言いたくなる感じの内容で、若干くどいというのもその通りだと思いましたが、良書だと思いました。
内容としてはリーダー神話は神話であって現実とは異なるということについてひたすらエビデンスを示しながら解説し、読者にはその前提に基づいて行動することを勧めていました。つまり、リーダー神話に存在するようなリーダーはほぼ実在せず、現実のリーダーが嘘をついてもそれほど罰せられることもないので、リーダーシップ教育産業の言葉に惑わされないように気を付けよという内容でした。
自伝とかリーダーシップ?に関する本は多少なりとも読んでいて、ほんとにそんな理想論でうまくいくのかなー?と以前から思っていたので、そういう意味ではとてもスッキリする本でした。
ゼロから作るDeep Learning 2章 パーセプトロン
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
最近、ゼロから作るDeep Learningを読んでます。現時点で4章まで読み終えてますが、ほんと読みやすいと思います。筆者が分かりやすく伝えようとしている熱意を感じる気がしていて、この方が他の書籍も出されたら是非読んでみたいと思ってます。
で、今回は2章 パーセプトロンです。読み終えてからエントリーを書くでもいいかなと思ってたいたのですが、手元のメモのボリュームが結構増えたこともありますし、この本の読書会もやってるのでそのメンバー向けに共有する意味でも、章ごとにエントリーを書こうかなと思いました。
ということで、以下2章に関するメモです。
- 2.1 パーセプトロンとは
- “本書では、0 を「信号を流さない」、1 を「信号を流す」に対応させて記述します。”
- 2.3.3 重みとバイアスによる実装
- “ここで −θ をバイアス b と命名しましたが”
- (2.1) 式においてθを閾値としていたが、(2.2) 式においては 0 を敷居としており、b を右辺に移行すると -b となるので前述のように説明している模様。
- “ここで −θ をバイアス b と命名しましたが”
- 2.4.2 線形と非線形
- 2.6 NAND からコンピュータへ
- “コンピュータの内部ではとても複雑な処理を行っているように思えますが、実は (驚くかもしれませんが)NAND ゲートの組み合わせだけで、コンピュータが行う処 理を再現することができるのです。”
- NANDからANDとORが作れるってことだろう。
- コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方に詳細が書いてあるとのこと。
- “理論上 2 層のパーセプトロンであればコンピュータを作 ることができる、と言えます。というのも、2 層のパーセプトロン(正確には活性化 関数に非線形なシグモイド関数を用いたもの:詳細は次章を参照)を用いれば、任意 の関数を表現可能であることが証明されています。しかし、2 層のパーセプトロンの 構造で、適切な重みを設定してコンピュータを作るとなると、それはとても骨の折れ る作業になるでしょう。”
- すげーな。。
- “コンピュータの内部ではとても複雑な処理を行っているように思えますが、実は (驚くかもしれませんが)NAND ゲートの組み合わせだけで、コンピュータが行う処 理を再現することができるのです。”
2章に関してはあまりメモがなかったですね、そういえば。。そもそも2章は分量少ないですし、Python機械学習プログラミング 達人データサイエンティストによる理論と実践 impress top gearシリーズについても別途読書会を実施していて、そちらでパーセプトロンについては勉強してたので、別の切り口で説明していて理解が深まったという感じでした。
2016年振り返り
2016年について振り返ってみたいと思います。ちなみに、去年は2015年振り返り - n3104のブログでした。
マネージャー職になった
2015年からビッグデータチームの立ち上げやデータ分析チームの立ち上げなどチームのリーダーという役職はやっていたのですが、2015年の5月からメンバーズという自社サービスを開発していくチームのマネージャーになりました*1。また、10月からの3ヶ月間だけでしたがアーキテクトグループというグループのマネージャも兼務していました。
リーダーやマネージャーという名前は会社によって意味は違うでしょうが、今までよりもチームの育成みたいなことについて取り組めたのはいい経験になっているかと思います。自分の中でこうやれば上手くいくだろうという仮説があっても、実際にその立場になって実践してみないことには上手くいくかどうかは確認できないので。チームの目的の共有や3ヶ月毎の振り返り、発生した課題に対応するという後手の状態から未然に防ぐ先手を打つような取り組み方についてメンバーに共有することが出来たと思うので、これから半年、1年後の結果がどうなるか楽しみです。
後はマネージャー職ということで評価もやるようになるのですが、評価する経験は今までになかったので怖さもありますが勉強できるという意味では楽しみだったりもします。評価ってほんと難しいと思っていて、評価は何を頑張って欲しいかというメッセージになるという認識でいます。そのため、間違えた評価制度や評価方法を採ると、本来の意図とは間違った方向にみんなが頑張ることになるので、全体のパフォーマンスを上げるような評価ってとても難しいと考えています。同時に、給与の原資は限られているので、全員が満足するような評価ができることはほぼないとも思っていて、だからこそ難しい評価というものをする側の経験をできるのは楽しみであると同時に怖さも感じています。まぁ、やってみないことには課題には気づけないでしょうから、まずは経験して少しずつ上手く出来るようになりたいと考えています。
それと、マネージャー職は打ち合わせだらけというのはよく聞く話だったのですが、ほんとに打ち合わせだらけになりましたね。アーキテクトグループマネージャーと兼務していた10月以降は月の7割以上が打ち合わせやトラブル対応になっていて、自分自身が担当している業務もあったりしたので、打ち合わせの合間の1時間で調査したり、コード書いたりするみたいな感じで、結果としてまったくブログが書けませんでした。。今年からはサービス開発グループのマネージャーのみになったので、自由に使える時間が増える分、(会社)ブログは再開したいと思ってます。
Hadoop
自社サービスのチームに移るタイミングで既存のHadoopを利用した集計バッチのリプレースを実施し、以降は保守/運用もやっています。前職から2年ぶりぐらいに日常的にHadoopに触れるようになりました。といっても、リプレースの時期は毎日のように触っていましたがリリース後は安定稼働しているのでたまにサービスメニューの追加に合わせた改修作業をする以外はほとんど触らないですがw
前職ではジョブフローの制御にBashを使っていたのですが、例外処理等が面倒だったので今回はPythonを使ってみました。結果的には成功だったと思います。AWS APIの呼び出しもBoto3経由で出来るのでBash+AWS CLIよりはかなり楽に実装できたと思いますし、保守も楽になったと思います。
他にもEMRの導入コンサル案件やAWSサポート業務の一環としてEMR関連のサポート案件を何件かやりました。Sparkについても調査用にSpark Shellは日常的に使うようになりました。
今年は集計バッチをHiveベースからSparkベースに移行するのはやってもいいかなと思ってます。処理の性質的にSparkの方が向いてそうなのと保守性も良くなりそうな印象があるので。処理時間も短縮できるしAWS利用費も下げられると予想してます。後はSparkのランタイム周りは結構謎なので、調査しても面白いかなと思ってます。何冊か書籍も読んだんですが、アプリケーションフレームワークとしてのSparkについて書かれている本はあっても、象本みたいにランタイム周りについて書いてある本がなかったので(実際に運用まですれば分かることなのかもですが)。
機械学習
本格的に取り組みはじめて1年半ほど経ち、去年と比べてもかなり理解が進んだと思っています。そこに知能があったりするわけではなくて、単に計算してるだけだと言うのが分かりました。あと数学、具体的には線形代数と微積分を理解しないとどうにもならないことも良くわかりました。社内の読書会を継続しているおかげで最近だと正則化が何をしているとか線形分離できない問題を非線形変換して線形分離するという考え方もイメージとして理解できるようなり、とても楽しいです。
機械学習関連だと以下を読みました。
- 社内の読書会
- 統計学のための数学入門30講 (科学のことばとしての数学) を読み終えた。
- 次に ITエンジニアのための機械学習理論入門 - n3104のブログ を読み終えた。
- 次に Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear) を読み始めた。現在5章まで来た。
- 個人的に読んだ
- Sparkによる実践データ解析 | Developers.IO
- まずはこの一冊から 意味がわかる線形代数 (BERET SCIENCE) を読み始めた。現在4章まで来た。
今後も機械学習の勉強は単純に面白いので継続するつもりです。あと今年は ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 も読むつもりなので、DNNでどうやってネットワークを設計するのか学んで以下みたいなことをやってみたいと思ってますw
後は機械学習を勉強していて思うのは、最近の機械学習関連や分散処理のブレイクスルーは結局ハードウェアの進化に起因してるんだなーと思うようになりました。元々Hadoopを学んでいた頃から漠然と思っていたことではあるんですが、読書会に80年代ぐらいに大学で機械学習を勉強していた方が参加してくれていて、実感を持つようになりました。具体的にはなんでこんな単純な理論でやってるのかみたいな話になることがよくあって、それは当時のハードウェアが貧弱すぎてそうせざるを得なかったみたいな話になります。結局ソフトウェア関連の理論自体は80年代ぐらいまでに出ていても、当時のハードウェアのスペックが貧弱すぎて検証できなかったわけで、それが最近の進化でやっと検証できるようになり、検証できるようになったので実用化されるようになったのだと。なので、今後も実用化される技術を調べたければ80年代ぐらいの論文を漁ったりすると面白いんだろうなーと思ってます。
SICP
まったく偶然ですが社内でSICPの読書会も始めました。隔週で毎回1時間でやっていて、2016年の間に19回やって2.2.3 公認インターフェースとしての並びまで来ました。問題も基本的に全て解いていて、恐らく読み終わるのにあと1年以上掛かると思いますw
私はLISPで書くのがどうしても馴染めず、途中からPythonで問題を解いてるんですが、cons/car/cdr/list/map/filterなどの標準関数もPythonで再実装することになり、おかげで言語仕様の違いとかも分かって勉強になりました。2016年に今更SICPを勉強することに意味があるかは正直わかりませんが*2、楽しいので続けるつもりです。現時点での成果は以下ぐらいですがw
- LISPのリストは一方向リンクリストしかない。他言語の配列やリストはなんて便利なんだろう。。!
- 再帰的な構造について意識するようになったというか、再帰の問題しかないw
- LISPのコードでもPythonで書き直せば理解できるという安心感を得た
- LISPのコードは宣言的でSQLみたい。まぁ、LISP式なので当たり前なのだけど
- デバッグ辛すぎる。手続き的アプローチと宣言的アプローチは適材適所で使い分けしよう!
Python
もともと機械学習でPythonがよく使われているので勉強したいと思っていたら、ちょうど集計バッチのリプレースがあったので未経験だったのですがPython使ってみました。その後、SICPでもPython使うようになり、とりあえずコード書くだけならさくっと書けるようになりました。いやー、Pythonいいですね。とても言語仕様がシンプルで書きやすいし、標準ライブラリも充実していて大抵のことは出来るので。
新しい言語を学ぶと比較軸を増やせて、結果として言語そのものやプログラミングへの理解が深まるので、今年も1つぐらい学べるといいなと思ってます。
その他
一時期忙しすぎてSAN値が下がったので8月ぐらいから1年ぶりぐらいにラノベ読んだり、10年ぶりぐらいにゲーム機でロープレやったりしてたら、最後はアマゾンプライムでアニメ観まくるようになりましたw ただ、QOLは急上昇したので、今年はうまくバランスを取りながら付き合っていくつもりです。Kindleも試しに買ってみたら思ったよりも読みやすくて技術書以外はKindleでもいいかなと思うようになりました。
- 喫茶タレーランの事件簿全5巻を読んだ
- 狼と香辛料全17巻を読み終わったら続編の18巻と狼と羊皮紙も出たので読んだ
- テイルズ オブ シンフォニア-ラタトスクの騎士をクリアした
- プライムでZガンダムの映画版3作、SAO シーズン1、デュラララ!! シーズン1、シュタインズ・ゲートを観た
プライムはほんとひどくて、SAOを12月から観はじめて、そのままデュラララを年末までに観終わり、最後にシュタインズ・ゲートは正月休み中に観終わっていて、3作で1ヶ月ぐらいしかかかっていないのがなんとも。。そして1/9時点で化物語の10話まで観終わっているという。。。
まとめ
振り返ってみると、2016年も変化の大きくて密度の高い1年だったと思います。後半は打ち合わせばかりしてて、自分がプレイヤーとして担当している仕事をあまり進められませんでしたが、そちらも今年は改善すると思うので上手くバランスを取って進めたいと思います。あと、読書会に3つ参加していましたが、勉強するリズムを維持できるので今後も続けたいと思っています。
ちなみに、2016年の振り返りをするためにクラスメソッドに入社してから更新していなかった職務経歴書を3年分更新したら案件数が 20 -> 65 に増えてました。。w*3
- 入社前:20案件(約12年)
- 入社後:45案件(約3年)
おかげで並行で案件を回したり、新規のお客様と話すのはかなり慣れたと思います。今後は自社サービスの開発チームが主体なので社外のお客様向けの仕事をする機会は減ると思いますが、勘が鈍るのである程度は定期的に社外の案件もやっておければと思ってます。
ITエンジニアのための機械学習理論入門
- 作者: 中井悦司
- 出版社/メーカー: 技術評論社
- 発売日: 2015/10/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
社内の読書会が終わりました。毎週1時間で全18回でした。5ヶ月弱です。一言で言うと非常に読みやすかったです。今まで何冊か機械学習の入門書を読んでいましたが、理論的なアプローチについて体系立てて、かつ、分かりやすく書かれていたと思います。同じテーマについて複数の手法を適用し、その差についても説明されているので、全体像も把握できるのがよかったです。数式も数学徒の小部屋というコラムで導出過程について説明されており、同僚の助けもあって何とか読める感じでした。以下、メモです。
- 統計学のための数学入門30講 (科学のことばとしての数学)を読んでいたおかげで数式は読めた。微積と線形代数と統計の基本的な知識(正規分布など)は知らないと読んでも面白く無いと思う。
- 話のわかりやすさを優先して、一部定義が曖昧だったり省略されていると感じる部分はあった。そういう箇所は気にせず読み飛ばして、筆者が全体として言いたいことだけ読み取るで良いと思った。何度か遭遇し、読書会のメンバーで悩んでも結論が出なかったのでw
- 改めてモデルを理解することは重要だと感じた。仕組みがわかれば向き/不向きも分かるので、とりあえずデータ集めて適当なモデルにぶち込んでとやっても精度出るわけないよなーと再認識した。既にみんなが取り組んでいるタスクでセオリーも存在し、素性と利用するモデルも分かっている場合はいいだろうけど。
- 読書会として読んでよかった。一人で読むと数式で心が挫けたり、読みやすいのでなんとなく理解した気になって読み飛ばしていたところがかなりありそうな感じだった。
- 数式はノートに写しながら導出過程を理解するのがいいかと考えていたけれど、同僚から計算結果だけを見て利用するスタンスでもいいのではと言われたのは結構衝撃だった。実際に深層学習 (機械学習プロフェッショナルシリーズ)を少しだけ読んだら計算の流れは似ていて、導出過程が分からなくとも結果となる数式の意味が分かればそれなりに読める感じだった。
- ソースコードがついているので実際に試せるのもよかった。ただ、ソースはあまり読みやすい感じではない気もした。
ということで、来週からはPython機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)に取り組みます。Pythonでさくっと機械学習のスクリプトを書けるようになるといいなと思ってます。
あと、参考までに読書会のメモについて以下に貼っておきます。ノートにとっていた数式のメモは貼るのが大変なので割愛します。あと、記号は意味がわかればいいと割り切りそれっぽくメモしたのでその辺りはご了承下さい。
- 主な数学記号と基本公式
- (12)は全微分みたい
- 合成関数の偏微分法(differentiation of composite functions)
- http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/calc/node49.html
- (12)は全微分みたい
- 2.1.4
- 2.1.5
- 2.2.4
- 3.1.3
- 3.2.2
- 3.2.3
- 一致性はデータ数を大きくすると真の値に近づいていくこと
- 不偏性は何度も推定を繰り返した際に、推定値の平均が真の母数に近づいていく。不偏性がある場合は、データ数が少ない場合に真の母数からはずれる可能性があるが、大きい方にはずれる場合と小さい方にはずれる場合が均等にある。
- 3.3.2
- 標本分散がずれるのは、「NS2n/σ2が自由度N-1のx2分布に従う」という事実に関係する。そもそも、標本分散S2nは正の値しか取らないため、散らばり具合が対称な形にならない
- 不偏分散はN/(N-1)倍したものなので、データの散らばり具合は対象な形にならない
- 不偏推定量というのは、あくまでも「多数の推定を繰り返した際の平均値」についての性質であって、1回の観測に基づく推定値の正確性を示すものではない
- 4.1
- パーセプトロンは誤差関数を使う手法?
- 一般的にはシグモイド関数を利用した識別手法
- https://en.wikipedia.org/wiki/Perceptron
- "In machine learning, the perceptron is an algorithm for supervised learning of binary classifiers"
- 日本語版Wikipediaは参考にしないほうがいい
- パーセプトロンは誤差関数を使う手法?
- 4.1.1
- (4.2)は普段見ている一次関数。f(x,y)=1 とかだと、それは切片(w0)
- 直線上は不正解としている?
- そもそも直線上を正解にできない手法。そうしないとその後の計算を透過的に扱えない。
- 4.1.2
- Σは判定に失敗したものだけなので、式に補足があってもいい気がする。
- 4.1.3
- 勾配ベクトルは一般的なもの?
- 「novikovの定理」→「パーセプトロンの収束性定理」で検索すると色々出てくる
- 4.2.1
- 4.30 式
- もっと効率のよい方法はあるのか?
- xとyのデータの分布に依存する?
- 正規化すれば問題ない?
- xとyのオーダーが異なる場合はどうなる?
- xとyにはバイアス項のようなものはつけられない。xとyは移動する距離が決まっている。一方cは任意なので計算する意味がありそう。
- もっと効率のよい方法はあるのか?
- w0は増え続けたりしない?
- tが + / - 両方あるので大丈夫。
- 局所解に陥ることはある?
- 収束したかどうかの判定条件に1つもエラーがないことがあるので、大域解に至るといえるのでは。
- 4.30 式
- 4.2.3
- 同次座標系
- http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1270910567
- 要は1次元増やすことで、1つのベクトルとして扱えるってことでいいみたい。
- グラフ描画
- Grapher
- 同次座標系
- 5.1.1
- ロジスティック関数の由来は?
- http://mathworld.wolfram.com/LogisticEquation.html
- http://math.stackexchange.com/questions/357918/why-is-logistic-equation-called-logistic
- 発表者がロジスティック曲線とだけ呼んでて、そういう風に命名した理由は述べなかった。。
- https://en.wikipedia.org/wiki/Logistic_function
- ロジスティック方程式 - Wikipedia
- 例題で学ぶ微分方程式
- ロジスティック関数の由来は?
- 5.1.3
- 計算コストで比較するとどうなのか?
- 現実的にあえてパーセプトロンを使うケースはあるのか?
- 次元が多くなると逆行列あるし、大変なのでは。
- 収束速度に差はあるのは?
- ニューラルネットワークの場合は活性化関数を変えることで変わることがある。
- やってみないと分からないので。
- 必ず 1 や 0 になる?そもそもロジスティック関数は距離が離れていれば 0 や 1 になるだろうが、近ければ 0.4 や 0.6 になるのでは?
- 5.2.3
- 下回るなら反転すればいいから、実際は学習してるはずw
- 階段みたいな線になったら、それはデータを増やせば直線になるはず。
- 最初下回って、途中から上回るみたいなのがあれば、そこで線を引いて反転させれば応用としては使えそう。
- 5.3
- 誤差関数の定義
- 最小化して目的とする値を得るための関数。
- 線形性がある
- 近傍
- 近くぐらいで理解しておく方が無難。位相とかに入ると危険。
- 凸性の判定条件
- 誤差関数の定義
- 6.1
- k-meansの他にk-medoidsとかあるらしい
- http://ibisforest.org/index.php?k-medoids%E6%B3%95
- Medoidは実際にデータセットに含まれる値から採用する点が異なる模様
- Why does k-means clustering algorithm use only Euclidean distance metric? - Cross Validated
- http://stats.stackexchange.com/questions/81481/why-does-k-means-clustering-algorithm-use-only-euclidean-distance-metric
- そもそも k-means はユークリッド距離しか扱えないのかという議論もある
- ソース読んだ方がいい。
- min_dist = sum( (256 - 0) ** 2 for i in range(3) )
- k-meansの他にk-medoidsとかあるらしい
- 6.2
- k近傍法も使える場面あるのでは。
- 7.1.1
- なぜこれで上手くいくのかという説明を構築するモデルが必要
- 7.1.2
- 7.2.1
- 7.10の左辺のμkはPの添字。
- EMで極限に飛ばすとk-meansになる。PARMに書いてあるらしい。
- http://stats.stackexchange.com/questions/117874/k-means-as-a-limit-case-of-em-algorithm-for-gaussian-mixtures-with-covariances
- http://stats.stackexchange.com/questions/132995/deriving-k-means-algorithm-as-a-limit-of-expectation-maximization-for-gaussian-m
- http://www.stat.ucla.edu/~yuille/courses/Stat161-261-Spring14/LectureNote14.pdf
- 7.2.2
- 7.14 画層生成器毎の確率Pνk(X)にπを掛けているから。
- 8
- 8.1.2
- 8.1.3
- 8.1.4
- (8.50)で分かっている前提の分散に収束するというのが書いてあるので、あくまで分散は分かっている前提だった模様。
- ベイズ推定の雰囲気を理解するのが趣旨なので、分散については分かっている前提で書いてあるのかも。
- 08-bayes_normal.py
- あくまでデータ件数が少ないと事前分布に引きづられると言いたいだけで、分散を出せると言いたいわけではない。
- 実際 33 行目で真の分散を計算式に代入している。
- mu_N = (beta_true * mu_ML + beta_0 * mu_0 / n) / (beta_true + beta_0 / n)
- (8.50)で分かっている前提の分散に収束するというのが書いてあるので、あくまで分散は分かっている前提だった模様。
- 8.2.1
- (8.65) は右辺がない場合は最小二乗法とおなじになる。そして右辺がある場合は最小化するために左辺のf(Xn)の中のWも含めて小さくなるという意味。要はαの大きさでWの大きさを調整できるということが言いたい。
- 8.2.2
- (8.69)はどうやって出す?
- 8.2.3
- 図 8.9
- オーバーフィッティングはM=9、α-1=10000でも図3.5のM=9のようになっていないという意味。
- 観測点から離れるほど分散が大きくなっていることが分かる。
- 図 8.10
- Wを4つ適当に選出しても、データ数が多くなれば分散が小さくなるので問題ない事がわかる。
- 8.9 はあくまでも観測データの話。
- 図 8.9
新世代デジタルマーケティング ネットと全チャネルをつなぐ統合型データ活用のすすめ
昨年末から年明けぐらいまで読んでました。
新世代デジタルマーケティング ネットと全チャネルをつなぐ統合型データ活用のすすめ
- 作者: 横山隆治
- 出版社/メーカー: インプレス
- 発売日: 2015/12/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
筆者のブログである業界人間ベムを以前から購読しており、面白そうだなと思って読みました。要約すると以下の様なことが書いてあったという理解です。
- デジタルとアナログの間を埋めよう
- 途中で施策を変えられるように運用していこう
- DSPをブランドコミュニケーションに利用しよう
- マーケティングダッシュボードを作ろう
- テレビCMの現状と新しい評価指標について
- ネットだけでなくリアル行動に関するデータを使ってターゲティングしていこう
- ブランド横断型の組織を再編しよう
- これからのマーケターの育成方法
読んだ感想としては、非常にわかりやすくて納得感があると同時に、書いてあることを実践するのは大変だろうなというものです。ざっくり言えば、いままでよりも意味のあるデータを集めてより細かい単位で運用をしましょうと書いてあるように読めました。私自身はマーケティングの仕事をしているわけではないので、実際のマーケティングの現場がどうなっているかは知りません。ですので、本書に書かれていることはある程度は既に現場で実践されていることなのかもしれませんが、従来よりも運用コストが上がるので投資対効果のバランスが難しそうな印象を持ちました。結局、各社が狙っている顧客の財布は同じで、マーケティングをより上手くやった会社がその取り分を増やすということであれば、他社に負けないというのが最適な戦略なんじゃないかなという印象も持ちました。あと、意味のあるデータは取得が難しいものもかなりあった気がするので、この辺はまだまだ先の話なのかなという印象も持ちました。とはいえ、私自身の本業はシステム構築なので、マーケティングの打ち手をよりコストを掛けずに実施できるお手伝いをしていければと思ったりもしました。
2015年振り返り
2015年について振り返ってみたいと思います。ちなみに、去年は2014年振り返り - n3104のブログでした。
ビッグデータチームのリーダーを担当した
2015年の前半は社内のビッグデータチームのリーダーを担当していました。主にやったのがプリセールスと全体のアサイン管理、個別プロジェクトの立ち上げです。案件によっては立ち上げだけでなくリーダーとしてお客様の窓口を担当したりしていました。後はサービスの設計とか作業の標準化の推進とかいろいろやってました。振り返りとしては以下になります。
- 初めてのお客様と話すことに慣れた気がする(内心冷や汗かかきながらではありますが)
- ビッグデータという切り口なので似たような案件なこともあり、お客様が困っている点の共通点が分かるようになった
- AWSやTableauについても多少詳しくなった(DXやRedshift、Tableau Server辺り)
- 新規の事業を作っていく過程について経験した
半年で10社ぐらい担当したのですが、やはり同じ領域で複数の案件を担当するのは大きいなと思いました。全体として見ると共通する部分と違う部分があり、どの辺りが共通の課題であったり技術要素であるのか分かるので。何よりいろいろなお客様の話を聞けるのが楽しいです。
後はエンジニア側のリーダーとして新規の事業を作っていく過程に立ち会えたのは大きいと思っています。ほんと最初はふわっとした所から徐々に形作っていくものだということがよく分かりました。全体としての方向性は決めつつも、後は臨機応変にやるものなんだなーと(事業によっては最初に事業計画を立てて、それを執行していくみたいな形でできるケースもあるのかもしれませんが)。後は、条件付きOKを出すということも大きな学びです。いろいろと課題が続出して、なので「やれない」と言いたくなるのですが、そうではなくて「こういう条件ならやれる」と回答することが重要なんだと実感しました。この辺りについては一緒にやっていた営業側のリーダーに色々と教えてもらい感謝しています。
データ分析チームを立ち上げた
2015年の後半はデータ分析チームというものを立ち上げました。具体的には4月にAmazon MLがリリースされたことに伴い、Amazon MLを利用した機械学習案件に取り組むようになりました。私自身はリーダーとしてプリセールス、個別案件のお客様との窓口を中心にやっていました。後はマーケティングとしてブログと登壇もやったりしました。とりあえず分かったのはデータ分析系の案件は自分にとって面白いということです。どの案件もその業務ドメインについて色々と知れるのも楽しいですし、仕組みについて検討するのも楽しいです。
新規に事業を立ち上げるという部分については、まだまだ立ち上げ中という感じではありますが、半年ぐらいでまったくゼロから立ち上げたにしてはそこそこ形になってきたかなと思っています。お客様とメンバーと会社に恵まれたなーと思ってます。あと、ブログとか登壇はほんと大きいなと思っていて、積み上げていくとそれだけでマーケティングにもなるし営業資料に使えるなーとw 何より自分自身の勉強にもなりますし、今後も継続していきたいと考えています。
ちなみに、会社ブログで機械学習関係は12本書いてました。機械学習そのものではなくてAmazon MLの機能に関するものが大半ですが(^_^;)
- SAP Predictive Analyticsの予測APIをAWS Lambdaを使って実現 | Developers.IO
- 良品計画様とAmazon Machine LearningのPoCを実施しました | Developers.IO
- Amazon Machine Learningでサザエさんじゃんけんを予測してみた | Developers.IO
- Amazon Machine Learningでバッチ予測の実行前に利用費が表示されるようになりました | Developers.IO
- FIT2015でAmazon Machine Learningの概要について話してきました | Developers.IO
- (レポート) BDT302: Amazon Machine Learningを使ったリアルワールドスマートアプリケーション #reinvent | Developers.IO
- RDS for MySQLでAmazon Machine LearningのDatasourceを作ってみた | Developers.IO
- Amazon AuroraでAmazon Machine LearningのDatasourceを作ってみた | Developers.IO
- EMR上でZeppelinとSparkを使ってレコメンデーション | Developers.IO
- マネジメントコンソール上でAmazon Machine Learningのリアルタイム予測を試せるようになりました | Developers.IO
- Amazon Machine Learningを利用したコンテンツの出し分け #アドカレ2015 | Developers.IO
- Amazon RedshiftでAmazon Machine LearningのDatasourceを作ってみた | Developers.IO
登壇
3回やりました。今後も機械学習関連のネタで登壇していければと考えています。
- 大晦日のメッセージ配信の裏側
- 「Tez on EMRを試してみた」というタイトルで話しました #cmdevio2015G | Developers.IO
- FIT2015でAmazon Machine Learningの概要について話してきました | Developers.IO
Hadoop
実務としては触らないで終わりました。勉強会もタイミングが合わず2回しか行けませんでした。会社ブログで振り返ると7本書いてました。
- EMR起動時に任意のソフトウェアを追加するには | Developers.IO
- 「Tez on EMRを試してみた」というタイトルで話しました #cmdevio2015G | Developers.IO
- AWSチーム社内勉強会「EMRおじさんに聞いてみよう」レポート | Developers.IO
- (レポート) BDT309: Amazon EMR上でデータサイエンスのためにApache Sparkを利用する際のベストプラクティス #reinvent | Developers.IO
- EMR上でZeppelinとSparkを使ってレコメンデーション | Developers.IO
- Amazon Elastic MapReduceのリリースバージョンの差異 | Developers.IO
- AWS再入門 Amazon Elastic MapReduce編 | Developers.IO
Tezの調査は面白かったです。YARNとかTezのソースを読んだりしつつ、EMRの挙動とかも調査したりしてました。あとはSparkですね。こちらは今後は本格的に使っていくことになるんじゃないかなと思ってます。あと次の機械学習にも関わりますがMahout in Actionの読書会もやったりしてました。
機械学習
半年ぐらいでかなり成長したなと思います。前職の頃から機械学習とか統計学について興味があって入門書を読んだりしていたのですが、実務経験はありませんでした。そのため正直どう進めればいいのか手探りでしたが、いまは案件の進め方は分かるところまで来たと思います。今後は理論面の強化と実務経験で引き出しを増やしていくという両方が必要だと感じていますが、とりあえず「やったことないからやれない」の壁は超えられたかなと思ってます。いやー、ほんと上手く行ってよかった(^_^;)
理論面の強化という点では社内で 統計学のための数学入門30講 (科学のことばとしての数学)の読書会をやっていて、半年かけてやっと25講ぐらいまで来ました。高校数学で挫折した状況だったので、いつも同僚の数学に詳しいメンバーに教えてもらっていて感謝しています。今後も数学の勉強を続けて、いつか数式の登場するようなブログを書きたいなと思っています。
あと機械学習は今まで積み上げてきたソフトウェア開発のスキルとはベクトルが異なるので、久しぶりにゼロから学習していくという経験も新鮮でした。ソフトウェア開発でそれなりにスキルが身についたと思えるようになるのに10年かかったので、機械学習も同じく10年ぐらいはかかるんだろうなーと思い、気長に取り組んでいくつもりです。
まとめ
他にも色々あり、2015年も非常に濃密な1年だったと思います。おかげさまで成長を感じられましたし、今後も学びたいことだらけなので、今年も充実した1年を過ごせればと思っています。