ビジネススクールでは学べない世界最先端の経営学

ビジネススクールでは学べない 世界最先端の経営学

ビジネススクールでは学べない 世界最先端の経営学

日経ビジネスで広告を見かけて「ビジネススクールで学べる経営学は、最先端からかけ離れている!」という煽りがおもしろそうだったので読んでみました。ビジネス書でよく扱われるようなテーマについて、経営学の論文をエビデンスとしてより一歩踏み込んだ解説がされています。それぞれのテーマの結論が「よく言われているのは◯◯だけど実は△△というのが論文で示されています」みたいな感じになっていて、とてもおもしろく読めました。また、文章も特に難しい言葉を使ったりせず読みやすかったです。ビジネス書を読む人であれば読んでみるといいと思いました。

ビジネス書でよく扱われるようなテーマとしては以下のようなものがありました。詳しくは目次を参照してください。

  • ポーターの競争戦略(SCP戦略)とリソース・ベースト・ビュー(RBV)は比較するのではなく、そもそも適用範囲が異なる。具体的には三つの競争の型(IO、チェンバレンシュンペーター)に対応付けることができる。
  • 組織の情報の共有で重要なのは「組織の全員が同じことを覚えていること」ではなく「組織の誰が何を知っているかを、組織の全員が知っていること」である。
  • グローバル化とよく言われるが、大半の企業はホーム地域の売上が半分以上を占めており、本当の意味でグローバル企業と呼べるような企業はほとんど存在しない。
  • 世界はグローバル化もしていないし、フラット化もしていない。
  • ダイバーシティー経営というが、デモグラフィー型の人材多様性は組織のパフォーマンスに影響を及ぼさない。
  • 同族企業は海外でも多いし、業績も悪くない。

本書を読んで改めて手法というのはそれ単体で成り立たず文脈に依存するということを認識できてよかったです。例えるならとりあえず体調が悪くなったら風邪薬を飲むみたいなやり方もあるんでしょうけど、切り傷や打撲に風邪薬を使うのは筋が悪いみたいな感じでしょうか。病気の治療でも症状に合わせて処置を変えるように、ビジネス上の課題も万能な手法はなくて前提に応じて手法を使い分ける必要がありますし、複数の手法を組み合わせる必要があることに気づけました。普段やっているシステム開発だと例えば単体テストのメリット・デメリットや導入する前提みたいなのは分かるんですけど、いわゆるビジネスそのものは経験が少ないので、そんな当たり前のことを認識できていませんでした。そのため、ここ1年ぐらいで読んだビジネス書の中で一番良い本であったと思います。今後も筆者が主張する「思考の軸」を増やせるようビジネス書を読んでいければと考えています。

ゼロから作るDeep Learning 7章 畳み込みニューラルネットワーク

前回はゼロから作るDeep Learning 6章 学習に関するテクニック - n3104のブログです。

7章では画像処理で利用される畳み込みニューラルネットワーク(convolutional neural network:CNN)について説明しています。

  • 7.2.1 全結合層の問題点
    • "全結合層の問題点は何でしょうか。それは、データの形状が“無視”されてしまう ことです。"
      • それが、Deep Learningの売りだと思ってたんだけど。。特徴抽出を考えるようになったら、それは従来手法と差がなくて、そうなると単に予測精度を上げられる代わりにより複雑なモデルとどう向き合うかが求められるようになっただけなのかなぁ。。 ← これは勘違いで7章を一通り読むと分かるけど、縦とか丸とか斜めとかそういう形を抽出するような処理は学習した結果得られるので、そういう意味では従来手法とは異なる。学習がしやすいようにデータに合わせたネットワークの構造にしているだけみたい。
  • 7.2.2 畳み込み演算
    • なるほど。フィルターが重みに相当するのか。
  • 7.2.3 パディング
    • 出力サイズを維持するための手法か。
  • 7.2.4 ストライド
    • フィルターを適用する間隔ね。フィルターという概念を入れたのでそこに選択肢がうまれるのは当然といえば当然か。いやしかし、既にハイパーパラメーターがかなり増えている気がするんだけど。。
  • 7.2.5 3 次元データの畳み込み演算
  • 7.2.6 ブロックで考える
    • 出力を3次元にする場合はフィルター自体をチャンネル数分用意する。これってつまりRGBみたいな感じだと、それぞれに対応するフィルターを用意することでRGBのチャンネルそれぞれに対応したフィルターに学習するってことなのかなー。
  • 7.3 プーリング層
    • "プーリングには、Max プーリングの他に、Average プーリングなどがあり ます。Max プーリングは対象領域から最大値を取る演算であるのに対して、 Average プーリングは、対象領域の平均を計算します。画像認識の分野にお いては、主に Max プーリングが使われます。そのため、本書で「プーリング 層」という場合は、Max プーリングを指すものとします。"
      • 圧縮と言えば圧縮だけど、要は特徴抽出だなー。
  • 7.3.1 プーリング層の特徴
    • 学習ではなくて特徴抽出の1手法ってことだよね。
  • 7.4.2 im2col による展開
    • "なお、図7-18 の図では、見やすさを優先し、フィルターの適用領域が重ならない ように、ストライドを大きく設定しています。実際の畳み込み演算の場合は、フィ ルター領域が重なる場合がほとんどでしょう。フィルターの適用領域が重なる場合、im2col によって展開すると、展開後の要素の数は元のブロックの要素数よりも多く なります。そのため、im2col を使った実装では通常よりも多くのメモリを消費する という欠点があります。"
      • ちょっと唐突で何を言ってるか分からない。先の実装見れば分かるかな。 ← 次節の7.4.3を見ると分かる。要は行列計算出来るようにフィルターの形に合わせて入力データを一部重複する形で変換している。
    • "im2col によって入力データを展開してしまえば、その後にやることは、畳み込 み層のフィルター(重み)を 1 列に展開して、2 つの行列の内積を計算するだけで す(図7-19 参照)。"
      • フィルタも同じように変換して行列計算にするのか。なるほど。最後のreshapeで元に形に戻すのも納得。結局同じ数字の並びをどういうデータ構造で表現してるだけだからなー。
  • 7.4.3 Convolution レイヤの実装
    • "これはフィルター(チャンネル 3、サイズ 5 × 5)の要素 数の総和です。"
      • で、行数が 9 なのは 7 × 7 の画像を 5 × 5 でストライド 1 のフィルターに適用しているので 3 × 3 = 9 になるということらしい。つまりフィルターの形に合わせて入力データを9レコードに変換していて、その際に一部データも重複することもある。
  • 7.4.4 Pooling レイヤの実装
    • np.max で処理できるようにまず im2col 関数でフィルタ単位に変換したデータを reshape してチャンネル単位にしている。なので、レコード数はフィルタの場合のレコード数 × チャンネル数になるはず。
  • 7.5 CNN の実装
    • 重みの初期化が単なるランダムに戻ってる。。CNNの場合の重みの初期値をどうするかは別途説明があるのかなー。
  • 7.6.1 1 層目の重みの可視化
    • 従来手法で自作していたフィルタを学習させることが出来るのがメリットということかな。そういう意味では多層ニューラルネットワークフレームワークであって、処理対象に応じてCNNのように入力データに合わせたレイヤーを選択するって感じかな。そういう意味では多層ニューラルネットワークは利用者側の選択肢が多いので他の手法と同列に扱うのは微妙かも。他の手法だと特徴抽出でとにかく頑張るって感じになるからなー。
    • "それでは、畳み込み層(1 層目)のフィルターを画像として表 示してみましょう。"
      • よくある猫の画像とかもこんな感じでフィルタを図に変換してたってことかなー。
  • 7.6.2 階層構造による情報抽出
  • 7.7.2 AlexNet
    • "ディープラーニング(層を深くしたネットワーク)は、多くの場合、大量のパ ラメータが存在します。そのため、学習には多くの計算が必要であり、さらに、 それらのパラメータを“満足”させるだけの大量のデータが必要になります。 GPU とビッグデータは、それらの課題に光を投げかけたと言えます。"
      • 非常に納得。アイディアを検証できる段階にハードとデータが追いついてきたって感じなんだよなー。 チャンネル

CNNの名前を聞いたことはあったのですが、詳細を知らなかったのでスッキリしました。また、多層ニューラルネットワークフレームワークというか考え方であって、対象領域に応じてCNNのような具体的な手法が存在することも理解できました。後は可視化のところは興味があるので別途リンク先について読むつもりです。

次回はゼロから作るDeep Learning 8章 畳み込みニューラルネットワーク - n3104のブログです。

Hooked ハマるしかけ 使われつづけるサービスを生み出す[心理学]×[デザイン]の新ルール

Hooked ハマるしかけ 使われつづけるサービスを生み出す[心理学]×[デザイン]の新ルール

Hooked ハマるしかけ 使われつづけるサービスを生み出す[心理学]×[デザイン]の新ルール

  • 作者: ニール・イヤール,ライアン・フーバー,Hooked翻訳チーム,金山裕樹,高橋雄介,山田案稜,TNB編集部
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/05/23
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (3件) を見る

社内でビジネスモデル・キャンバスのワークショップをやった際に、講師である同僚が紹介していたので読んでみました。翻訳書ですがとても読みやすかったです。ページ数も200ページほどで、説明も具体例を交えながら説明してあり、サラッと読めました。タイトルの通り使われ続けるサービスを作るためのノウハウが書かれているので、サービスの企画をやる人は読んでみるといいと思いました。

TwitterFacebookGoogleのように日常的に利用してもらうようなサービスにするには、サービスを利用することをユーザーの習慣にする必要があるというのが本書の前提です。そしてユーザーの習慣となるようなサービスにするために「フック・モデル」というフレームワークを紹介しています。フック・モデルは以下の4つのステップに分かれており、そのステップをユーザーに何度も繰り返し経験してもらうようにすることで、ユーザーはサービスを利用することを習慣とするようになります。

  1. トリガー( きっかけをもたらす)
  2. アクション( 行動をうながす)
  3. リワード( 報酬を与える)
  4. インベストメント( 投資させる)

各章の最後に「今すぐやってみよう(Do This Now)」という課題があり、実際に企画する際はこの課題をそのまま利用できそうでした。Running Lean ―実践リーンスタートアップ (THE LEAN SERIES) *1を読んだ際も思いましたが、具体的な指示が書かれていると、まずはそれを試すことが出来るので、そういう意味でも良い本だと思いました。

*1:そういえばブログ書いてない。。

ヤフーの1on1―――部下を成長させるコミュニケーションの技法

ヤフーの1on1―――部下を成長させるコミュニケーションの技法

ヤフーの1on1―――部下を成長させるコミュニケーションの技法

自分がマネージャーをやってるチームで1on1をやってみようという話になったのですが、1on1についてまったく知らなかったので読んでみました。ページ数も240ページ程度でさくっと読めますし、内容も事例と対談中心で読みやすかったです。1on1がどういうものか知りたい人はとりあえず読んでみるといいと思いました。

読んでみて、とりあえず1on1をやってみようと思うようになりました。読む前までは目的や効果について懐疑的な印象を持っていました。メンバーの育成が目的の手法に見えていて、現在のチームのメンバーは全員自律的に動けるメンバーばかりで、今更かなーという印象があったので。読み終わってもその印象が完全に拭えてはいないのですが、とりあえず暫くやってみて判断しようという気持ちになりました。理由は以下の通りです。

  • 文面から筆者の真摯な人柄というか育成に対する熱が伝わった。
  • 効果はやらないと実感できないと書かれていた。
  • 普段のコミュニケーションの種類が私(マネージャー)からメンバーに対する進捗確認や課題解決になりがち。メンバーから私へのコミュニケーションを増やすことで気づきがありそう。
  • 1on1をやったことがない。やったことがないことはやってみないと判断できない。

ということで、以下のルールで暫く実施するつもりです。

基本は毎週らしいのですが、それは辛いので隔週としました。あと、毎日様子を見てると毎週ネタが見つかるみたいなことが書いてあったのですが、今の職場は週の半分はリモートワーク+オフィスも地理的、タイムゾーンすら異なるメンバーなので、ネタが見つかる印象を全く持てなかったのもあります(^_^;)

失敗の本質

失敗の本質―日本軍の組織論的研究 (中公文庫)

失敗の本質―日本軍の組織論的研究 (中公文庫)

この前同僚が読んでいたので、そういえば読んでいなかったなと思って読みました。半分以上が1章の事例研究で占められていて、エビデンスを示すことに丁寧という印象を持ちました。また、2章の分析内容についても的確だと思いまし、3章の教訓についてもその通りだなと思う内容でした。組織運営みたいなものについてあまり読んだことがない人が読むにはよいのかもしれません。また、歴史書として興味がある方にもいいのかもしれないと思いました。

個人的には、何というか、分析対象が事例として指摘事項が多すぎる状態だったのであまり学びはありませんでした。どちらかというと、もうちょっとまともな状況な事例についての分析を読めるといいかなと思いました。そりゃ駄目だろみたいなツッコミどころ満載だったので。。類書か分かりませんが、戦略や兵站という意味では戦略の本質補給戦―何が勝敗を決定するのかを読んだ方がいいかと思いました。

ゼロから作るDeep Learning 6章 学習に関するテクニック

前回はゼロから作るDeep Learning 6章 学習に関するテクニック - n3104のブログです。

6章です。5章まででニューラルネットワークの学習の仕組みについては学んできたため、6章では実際に学習を行う上で選択することになる各種パラメーターについて説明しています。具体的には重みについて扱っています。まず 6.1 で重みパラメーターを探索する際の最適化手法を、6.2 では重みの初期値について、6.3 で重みの初期値の問題を学習時に解決するBatch Normalizationについて、6.4 で過学習について扱っています。

  • 6.1.3 SGD の欠点
    • 図もあるし、説明がとても分かりやすい。
    • “図 6 - 2 で表される勾配は、多くの場所で (0, 0) の方向を指さ ないということです。”
      • “図6-3 に示すようなジグザグな動きをします。"とあるように、学習できないという意味ではなくて効率が悪いという意味。
      • “つまり、SGD の欠点は、関数の形状が等方的でないと――伸びた形の関 数だと――、非効率な経路で探索することになる点にある”
        • かといって一般的に他の機械学習の手法だとSGDが利用されていると思うので、これから登場する手法もトレードオフがあるんだろうなー。
  • 6.1.4 Momentum
    • 勾配の変化も情報として扱うようにしたって感じかー。なるほど。
    • self.v[key] = np.zeros_like(val)
    • 説明だけ読むとSGDの代わりにMomentum使っておけばよさそうだけど、あまり聞かないのは何らかの制約なりトレードオフがあるんだろうなー。
  • 6.1.5 AdaGrad
    • 学習係数の減衰(learning rate decay)をパラメータ毎に実施したものということか。
    • 式自体は非常にシンプル。そのまんま。
    • 結局、勾配を利用するという部分はどの手法も同じなんだなー。
    • “最後の行で 1e-7 という小さい値を加算している点で す。これは、self.h[key] の中に 0 があった場合、0 で除算してしまうことを防ぐ ためのものです。多くのディープラーニングのフレームワークでは、この小さな値も パラメータとして設定できますが、ここでは 1e-7 として固定の値を使用しています。”
  • 6.1.6 Adam
    • MomentumとAdaGradをくっつけられないかと思ってたら、まさにそれがAdamだったw
    • “また、ハイパーパラメータの「バイアス補正(偏りの補正)」が行われてい ることも Adam の特徴です。ここでは、これ以上踏み込んで説明することは避け ます。詳細は原著論文 [8] を参照してください。”
    • “また、Python の実装については、 common/optimizer.py に Adam というクラスで実装してあるので、興味のある方 は参照してください。”
      • Adamについては理論がやや複雑というだけあって、紹介に留めてるんだなー。
      • https://arxiv.org/abs/1412.6980
        • 普通に右側のDownloadのとこからダウンロード可能。
  • 6.1.7 どの更新手法を用いるか?
    • SGD、Momentum、AdaGrad、Adam と 4 つの手法を説明してきましが、どれ を用いたらよいのでしょうか? 残念ながら、すべての問題で優れた手法というのは (今のところ)ありません。それぞれに特徴があり、得意な問題、不得意な問題があります。”
      • ですよねー。
    • “多くの研究では今でも SGD が使われています。Momentum や AdaGrad も試す価値のある手法です。最近では、多くの研究者や技術者が Adam を好んで使ってい るようです。本書では、主に SGD や Adam を使用しますが、読者の方においては、 自分の好きなようにいろいろ試してみてください。”
      • やはりSGDが使われてるんだなー。でも最近だとAdamも使われるようになってると。従来手法でもAdam使われるようになるのかなー。
  • 6.1.8 MNIST データセットによる更新手法の比較
    • “この実験の注意点として は、学習係数のハイパーパラメータや、ニューラルネットワークの構造(何層の深さ か、など)によって結果は変化するということです。ただし、一般に SGD よりも他 の 3 つの手法のほうが速く学習でき、時には最終的な認識性能も高くなります。”
      • 結局、Deep Learningになったからと言って今までよりもモデルの作成が楽になるってことはなくて、最終的な予測精度が高くなるケースがあるってぐらいなんだろうなー。。
  • 6.2.1 重みの初期値を 0 にする?
    • “なぜ重みの初期値を 0 にしてはいけない――正確には、重みを均一な値に設定して はいけない――のでしょうか? それは誤差逆伝播法において、すべての重みの値が 均一に(同じように)更新されてしまうからです。”
      • 確かに重みが 0 だと計算結果は Wij * xn = 0 でバイアス項のみが残ることになるな。でもバイアス項があるから完全には 0 にならない気もするが。。
        • 実際に4章の train_neuralnet.py で試してみた所、やはりバイアス項をランダムに初期化するだけでも学習は進んでいた。ただし、遅くなるが。そして、バイアス項も 0 にしても学習自体は進んでいた。ただし、とても遅くはなる。
          • バイアス項も 0 にしても学習が可能なのは、損失関数の結果が逆伝播するため。入力が一律 0 でも出力層で損失関数を計算するとノードによって値が異なることになるので、その差分を逆伝播する過程で少しずつ重みとバイアス項についても変化することになる。dy = (y - t) / batch_num の箇所。

デフォルトの weight_init_std=0.01 の場合 f:id:n-3104:20170716153129p:plain

weight_init_std=0 に変更した場合(biasは 0 のまま)

        weight_init_std = 0
        self.params['b1'] = np.zeros(hidden_size)
        self.params['b2'] = np.zeros(output_size)

f:id:n-3104:20170716153141p:plain

weight_init_std=0 で bias をランダムにした場合

        weight_init_std = 0
        self.params['b1'] = np.random.randn(hidden_size)
        self.params['b2'] = np.random.randn(output_size)

f:id:n-3104:20170716153152p:plain

  • 6.2.2 隠れ層のアクティベーション分布
    • 重みの初期化方法と活性化関数の組み合わせである層の出力がどのような分布となるかを確認できる。
    • 前節で 0 の場合について触れていたので実際に 0 にしてみたら全て 0.5 となった。バイアス項も無いので当然といえば当然だが。
    • “逆に、偏ったデータが流れると、勾 配消失や「表現力の制限」が問題になって、学習がうまくいかない場合があり ます。”
      • そもそもデータに偏りがあることを機械に学習させるのが機械学習だと思うのだけど、あまりに極端なケースだとDeep Learningでは扱えないってこと?それともあくまでも重みに限った話なのかなー。
    • w = np.random.randn(node_num, node_num) / np.sqrt(node_num) は割り算になっているが weight_init_activation_histogram.py は掛け算になっているので注意。
      • w = np.random.randn(node_num, node_num) * np.sqrt(1.0 / node_num)
    • tanh 関数は、sigmoid 関数と同じ S 字カーブの関数ですが、 tanh 関数が原点 (0, 0) で対称な S 字カーブであるのに対して、sigmoid 関 数は (x, y) = (0, 0.5) において対称な S 字カーブです。なお、活性化関数に 用いる関数は、原点対称であることが望ましい性質として知られています。”
      • じゃあ、最初から tanh 関数使えばいいのでは。。

tahn 関数の場合の結果は以下の通り。釣鐘型と言えばそうだけど、右半分になっているような。。 f:id:n-3104:20170716153211p:plain

  • 6.2.3 ReLU の場合の重みの初期値
    • “以上のまとめとしては、活性化関数に ReLU を使う場合は「He の初期値」、sigmoid や tanh などの S 字カーブのときは「Xavier の初期値」を使う――これが現時点で のベストプラクティスということになります。”
      • ベストプラクティスというなら従えばいいとは思うが、逆に言うと従わないとまともに学習できないってことかー。。
  • 6.2.4 MNIST データセットによる重み初期値の比較
    • なるほど。今までは学習できていた std=0.01 で学習できなくなったのは隠れ層が 1 -> 4 層に増えたからかー。で、その結果ほとんどの値が 0 になり、結果として勾配消失となって学習が進まなくなったというわけか。実際、隠れ層を 1 に変えて weight_init_compare.py を実行したら今まで通り std=0.01 でも学習できた。

隠れ層 1 の場合 f:id:n-3104:20170716153234p:plain

    networks[key] = MultiLayerNet(input_size=784, hidden_size_list=[100],
                                  output_size=10, weight_init_std=weight_type)
  • 6.3 Batch Normalization
    • “そ れでは、各層で適度な広がりを持つように、“強制的”にアクティベーションの分布 を調整してみてはどうでしょうか?”
      • こういう発想いいなー。Deep Learningが実際に利用されるようになって数年だから、まだまだこういうチューニングの余地って残されてるのかなー。
  • 6.3.1 Batch Normalization のアルゴリズム
    • “そして、入力データを平均が 0 で分 散が 1 になる――適切な分布になる――ように正規化します。”
      • 結局、やってることはこれだけといえばこれだけなんだよね。
    • “さらに、Batch Norm レイヤは、この正規化されたデータに対して、固有のスケー ルとシフトで変換を行います。”
      • たんに正規化するだけじゃなくてスケール変換とシフトしてるのが肝なのでは。
      • γとβについても学習させるのかー。実際、MultiLayerNetExtend 中で勾配を求めていて、学習させていた。
        • 勾配万能だな。。もちろん、局所解に入り込むことはあるんだろうけど、それも元の数式次第だろうし、今回みたいに単純な式だと大域解に至るのかなー。
    • “初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくてよい)”
      • 図 6-19 見た感じだと、初期値もやはり重要なのでは。。とはいえ、「活性化関数に ReLU を使う場合は「He の初期値」、sigmoid や tanh などの S 字カーブのときは「Xavier の初期値」を使う」を適用した上でやるならまず大丈夫って感じかなー。
    • 過学習を抑制する(Dropout などの必要性を減らす)”
      • 6.4.3 Dropout で出てくる。"Dropout は、ニューロンをランダムに消去しながら学習する手法です。訓練時に 隠れ層のニューロンをランダムに選び出し、その選び出したニューロンを消去しま す。"
  • 6.4.1 過学習
    • “また、ネットワークの複雑性を高めるために 7 層のネットワーク――各層 のニューロンの個数は 100 個、活性化関数は ReLU――を使います。”
      • なるほど。ネットワーク自体は複雑だから訓練データの認識精度を 100% にできるのか。これはこれでおもしろい。
    • 実際に試す際は overfit_weight_decay.py の # weight decay(荷重減衰)の設定 の箇所を 0.1 -> 0 に変える必要がある。weight_decay_lambda = 0.1となっているのは次節 6.4.2 Weight decay に対応したコード。
  • 6.4.2 Weight decay
    • 要は重みに対するL2正則化
    • ノルムってそう言えばどういう意味だっけ?
    • multi_layer_net.py のソースを見ていたら、正則化項は全て隠れ層の重みを足して最後に損失関数にペナルティ項として追加されていた。ニューラルネットワークの場合は層が何層もあるのでL2正則化の場合はその全ての層の重みを足し上げるんだー。まぁ、そもそも正則化項は重みを小さくするもので、その重みが各層に存在するのだから、全ての層の重みを対象とするのは同然なんだろうけど、なんとなく乱暴な感じでおもしろかったw
      • そういう意味だとニューラルネットワークの重みに対してL1正則化は利用しないんだろうなー。
      • “Weight decay は、すべての重みに対して、損失関数に 1 λW2 を加算します。” と本文に書いてはあったんだけど、そういう意味だと読んでも気づかなかった。やはりソース読むのは大切だなー。
    • “図6-21 のとおり、訓練データの認識精度とテストデータの認識精度には“隔たり” がありますが、Weight decay を用いなかった図6-20 の結果と比較すると、その隔たりは小さくなっています。これは過学習が抑制されたということです。また、訓練データの認識精度が 100%(1.0)に到達していない点も注目すべき点です。”
      • 確かにかなり改善されてる。とはいえ、元々過学習が発生するような訓練データの少ない状況が問題なので、そういうデータを集められない状況下での過学習の抑制ぐらいにしか効果はなくて、予測精度を上げたいなら訓練データを集める方が重要なんだろうなー。それとも、一般的に適用するのかなー?
  • 6.4.3 Dropout
    • “つまり、Dropout は、アンサンブル学習と同 じ効果を(擬似的に)ひとつのネットワークで実現していると考えることがで きるのです。”
      • 表現力が高いがゆえに、1つのネットワークで複数のモデルを表現できるってことかなー。でもアンサンブル学習は認識精度の向上が目的であって過学習の抑制は目的でないと思うんだけど。。
    • dropout_ratio = 0.20, 0.50 と増やすほど過学習は抑えられたが学習自体が進まなくなった。
    • multi_layer_net_extend.py のソースを見てて思うが、ほんと概念としてのレイヤと個々の計算レイヤは別物だなと思う。DropoutもDropoutを個々の隠し層に追加してDropout付きレイヤにしてて、デコレータパターン見てるような気持ちになる。
            if self.use_dropout:
                self.layers['Dropout' + str(idx)] = Dropout(dropout_ration)

dropout_ratio = 0.20 f:id:n-3104:20170716153409p:plain

dropout_ratio = 0.50 f:id:n-3104:20170716153419p:plain

  • 6.5 ハイパーパラメータの検証
    • “ハイパーパラメータの決定には一般に多くの試行錯誤が伴い ます。ここでは、できるだけ効率的にハイパーパラメータの値を探索する方法につい て説明します。”
      • 結局、これが解決しないと従来手法と大差ない気がする。。まぁ、予測精度は従来手法より上げられるようなので、そこはブレイクスルーなんだろうけど。
  • 6.5.1 検証データ
    • “それは、テストデータを使ってハイパーパラメータを調整するとすれば、 ハイパーパラメータの値はテストデータに対して過学習を起こすことになるからで す。”
    • “そのため、ハイパーパラメータを調整する際には、ハイパーパラメータ専用の確認 データが必要になります。ハイパーパラメータの調整用のデータは、一般に検証デー タ(validation data)と呼びます。この検証データを使って、ハイパーパラメータの 良さを評価します。”
      • なるほど。別に用意するんだ。
    • “訓練データは、パラメータ(重みやバイアス)の学習に利用します。検証デー タは、ハイパーパラメータの性能を評価するために利用します。テストデータ は汎化性能をチェックするために、最後に(理想的には一度だけ)利用します。”
      • ニューロンの数まで変えたら、それは訓練からやり直しになるんでは。。
    • “ shuffle_dataset という関数は、np.random.shuffle を利用したもので、common/util.py に、その実装があります。”
  • 6.5.2 ハイパーパラメータの最適化
    • 結局探索するだけw
    • ニューラルネットワークのハイパーパラメータの最適化では、グリッドサーチ などの規則的な探索よりも、ランダムにサンプリングして探索するほうが良い 結果になることが報告されています [15] 。これは、複数あるハイパーパラメー タのうち、最終的な認識精度に与える影響度合いがハイパーパラメータごとに 異なるからです。”
      • “設定されたハイパーパラメータの範囲から、ランダムにサンプリングする。”
      • ほんとランダムなんだなーw
    • “ハイパーパラメー タの最適化において、より洗練された手法を求めるとすれば、ベイズ最適化(Bayesian optimization)が挙げられるでしょう。ベイズ最適化は、ベイズ の定理を中心とした数学(理論)を駆使して、より厳密に効率良く最適化を行 います。詳しくは、論文「Practical Bayesian Optimization of Machine Learning Algorithms」[16] などを参照してください。”
  • 6.5.3 ハイパーパラメータ最適化の実装
    • “この結果を見ると、うまく学習が進んでいるのは、学習係数が 0.001 から 0.01、 Weight decay 係数が 10−8 から 10−6 ぐらいということが分かります。このように、 うまくいきそうなハイパーパラメータの範囲を観察し、値の範囲を小さくしていき ます。そして、その縮小した範囲で同じ作業を繰り返していくのです。そのようにし て、適切なハイパーパラメータの存在範囲を狭め、ある段階で、最終的なハイパラ メータの値をひとつピックアップします。”
      • こういう作業なら機械にやらせるでいい気がする。。問題はネットワークのノード数とか隠れ層の数とかそっちだと思う。
      • 時間がネックになるという話で、結局ハードの進化に依存してる話だなと改めて思うなー。

従来手法と比べてDeep Learningニューラルネットワークを多層にすることで表現力を増やすことが出来る反面、学習に時間がかかったり勾配損失のような問題が発生するため、その問題を解決するための手法が色々考えられているんだと改めて実感できる章だったと思います。従来手法であれば入力データの特徴抽出に悩むわけですが、Deep Learningはそこは悩まないで良い分、ネットワーク設計と学習自体をどう進めるかについて悩むことになるんだなぁーと。

次回はゼロから作るDeep Learning 7章 畳み込みニューラルネットワーク - n3104のブログです。

Developers.IO 2017に参加しました

先週*1Developers.IO 2017に行ってきました。

Developers.IO 2017|EventRegist(イベントレジスト)

自社イベントなんですが、今回は登壇者ではなかったので普通に一参加者として参加しました*2。残念ながら私用で午前の基調講演は聞けなかったのですが、参加できたセッションはどのセッションも普通におもしろく、改めていいイベントだと思いましたw

ということで、参加したセッションの感想を残しておきたいと思います。

L-1】 ランチセッション

クラスメソッドの代表である横田の会社紹介でした。相変わらず売上とか従業員数とかの数字を赤裸々に話していて、横田さんらしいなーと思いながら聞いてました。最近いらすとやにハマっているのもネタにしていて、一緒にお弁当を食べていた同僚と「またいらすとやだw」と話してました。なお、お弁当はほんと美味しかったです(^q^)

【H-1】 今からはじめるボードゲーム解析

Developers.IO 2017セッション「今からはじめるボードゲーム解析」で話しました #cmdevio2017 | Developers.IO

解析とタイトルにあるようにボードゲームを解析的に解こうとするとこういう感じになるというのが分かって面白かったです。ゲーム木の辺りまで行くと探索の枝刈りみたいな感じかなと思ったり、局面の値は機械にやらせるには数値に落とし込んで比較できるようにする必要があるので、機械学習の損失関数みたいだなーと思ったりしてました。あとは局面の直和の帰結類に未確定のものがあるのは、要はゲーム開始時点で先手と後手のどちらが勝つか確定していないゲームであることを意味するのかなと思ったりしました。

AWSにはまったく関係ない内容でしたが非常におもしろかったので、平田さんには次回もぜひAWSと関係ないテーマで話してもらいたいと思いましたw

【A-2】 基礎からの OAuth 2.0 〜 認証と認可の概念、認可コードとアクセストークンの意味 〜

Developers.IO 2017セッション「基礎からの OAuth 2.0」でお話してきました #cmdevio2017 | Developers.IO

いやー、ほんと分かりやすかったです。認証と認可については都元さんと休憩室で雑談していた内容を思い出したりしつつ、OAuth 2.0自体は特に勉強していなかったので一気に概要把握できたと思います。もともと6年前ぐらいにGoogleTwitterAPIをOAuth 1.0で操作してたりしたことがあるので、その頃の記憶を思い出しながらなるほどなーと思ったりしてました。当時このスライドがあればよかったのにと思いました。OAuthについて学ぶ際は最初にこのスライドを見るといいと思います。

それにしてもOAuth 2.0にはフローが4つもあるのは知らず驚きました。4. Authorization code grantぐらいしか認識してなかったので。3. Implicit grantはまだスマフォアプリがあるので納得ですが、残りの1. Client credentials grantと2. Resource owner password credentials grantを利用するケースがあるのかちょっとイメージがわかなかったです。

【A-3】 開発環境でのDocker活用事例と本番運用に向けて考えたこと

Developers.IO 2017セッション「開発環境でのDocker活用事例と本番運用に向けて考えたこと」で話しました #cmdevio2017 | Developers.IO

Dockerについて詳しくないので聞きました。そういう意味でDockerの基本から説明してくれたのでちょうどよい内容でした。あとは実際に試してみてなので。。

【C-4】 Voice User Interface の歴史と未来

Voice User Interface の歴史と未来 – 人類は VUI にたどり着き、どこへ向かうのか #cmdevio2017 | Developers.IO

VUI(Voice User Interface)が今後どのように発展していくのか知れたらいいなと思って聞きました。タイトル通り歴史ということでCUIGUI、NUIの歴史について説明した上でのVUIの歴史と未来についての話でした。今まで聞いたことがないような話が多く、とても面白かったです。

なんというか、今まで参加した勉強会では聞けないような内容で、こういうセッションが成立するのはDevelopers.IOならではな気がしてとてもいいと思いました。

最後に

企画運営をしてくれたクラスメソッドマーケティング部のみなさま、登壇者のみなさま、同僚のスタッフ各位に感謝です。会場提供してくれたSAPジャパン様にも感謝です。そして、何よりもご来場いただいたみなさまに感謝です。参加者がいなければ企画自体が成立しませんのでm(__)m

次回も一参加者として参加して楽しめればと思ってますw

*1:あれ、まだ1週間しか経ってないんでしたっけ。もうだいぶ前の印象があるんですが。。

*2:一応スタッフ業務もやってましたがちょっとお手伝いする程度で無いに等しいぐらいでした。