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は計算コストが高いのであまり深いのはみないが,可能は可能である.

Special applications: Face recognition & Neural style transfer

CouseraのDeepLearningのコース受講メモ. CNNのコースの最後

Face Recognition

What is face recognition?

face recognitionとして扱う問題は大きく分けて2つあり,顔認証と顔認識である.

顔認証はカメラで撮った顔画像とIDを元に,提示されたIDの所有者がその顔の人かどうかを判定する. IDを元にシステムから顔画像を持ってきて,撮影された顔がシステムから持ってきた画像と同一人物かそうでないかを判定する. 撮影された画像1に対して,システムが持っている画像1が正しいかを判定するタスクであり,後述の顔認識と比べると比較的簡単.

顔認識は,カメラで撮った画像が,システムに格納されているどの人物かを当てる.顔認証とは異なり,IDは存在しない. 撮影された画像1に対して,システムが保持するK人の顔画像と比較し,K+1(いずれでもないを含める)にクラスわけする. 顔認識は顔認証に比べて難しい.

One Shot Learning

従業員の入退ゲートの制御にシステムを用いたいが,そのシステムに組み込むモデルの学習に使えるデータは多くないはず.とある従業員の顔画像なんて1つしか得られないこともある.そのため,通常のCNNだと教師データが足りずにうまく動作しない.

これをうまくいかせるために,考え方を変える. d(image1, image2)=画像がどの程度異なるかを出力する関数を学習させることで,これを実現する. d(A,B)は大きな値を,d(A,A')は小さな値を出力するような関数を学習させておくことで,システムが保持する従業員の写真と,撮影した写真を比較してその二つが同一人物であるかどうかの評価値が得られる.

関数dの学習は必ずしも識別したい従業員の写真がなくても可能で,学習済みのモデルを新たな従業員に適用してもうまく動作する.

具体的な方法を次の章で説明する.

Siamese Network

CNNで得られる層の途中の表現を取り出して,それを特徴量としてエンコーディングされたベクトルと呼ぶ(図1).

f:id:masamasah:20180922141732j:plain

このエンコーディングされた特徴量を比較したい画像についてそれぞれ計算し,その距離(L2ノルム)を計算することでどの程度似ているかを明らかにする(図2).

f:id:masamasah:20180922141744j:plain

同じ人の画像であればL2ノルムは小さく,異なる人の画像であればL2ノルムは大きくなる.

Triplet Loss

特徴量を適切にエンコーディングできるCNNはどのように学習するべきか?を説明する.

学習のための損失関数としてTriplet損失を使う. Tripletとは「3つ」のという意味で,認識対象の画像(Anchor)と認識対象と同一人物の画像(Positive)と異なる人物の画像(Negative)の3つのセットを用いて定義される損失である.

Triplet損失を図3に示す.

f:id:masamasah:20180922141813j:plain

左辺のノルムは「同一人物の画像をエンコーディングした際のL2ノルム」であり,右辺が「異なる人物の画像をエンコーディングした際のL2ノルム」である. このノルムについて「同一人物の画像をエンコーディングした際のL2ノルム」が「異なる人物の画像をエンコーディングした際のL2ノルム」よりα以上小さくなるようにするという制約である.なおαはhyper-parameterである.

これを規範としてCNNのモデルを学習し,エンコーディングのためのネットワークを学習する.

最終的にはこのモデルを用いて入力と比較対象をエンコーディングし,そのL2ノルムが閾値を越えなければ同一人物であると判定したりする.

Face Verification and Binary Classification

手動で閾値を決める代わりに,エンコーディングされた特徴量ベクトルを用いてロジスティック回帰で判定するような方法もある.

Neural Style Transfer

What is neural style transfer?

とある画像を,別の画像のスタイルに変換して描写するタスクのことをneural style transferという.

撮影した画像を,例えばゴッホの絵画っぽくすることができたりする.

What are deep ConvNets learning?

neural style transferはCNNのモデルのとある特徴を活用して実現されている. ここではまず,その特徴を説明する.

CNNのネットワークについて,浅い層と深い層では学習する内容にどんな違いがあるのか?という特徴だ.

浅い層では,画像のプリミティブな特徴(例えばエッジや平面など)を学習する.

深い層ではそれらを組み合わせてより複雑な特徴(例えば人の顔や車の形など)を学習する.

簡単なイメージを図4に示す.

f:id:masamasah:20180922141754j:plain

これらの特徴を用いて.neural style transferが実現される.

Cost Function

neural style transferは以下の手順で行われる.

まず,入力画像C(変換したい画像)とスタイル画像S(こういうスタイルにしたいと思った画像)の2つをえる.次に,出力画像G(入力画像をスタイル画像のスタイルに変換した画像)の候補としてランダムに生成された画像を作る.

次に,ランダムに生成された画像と入力画像,スタイル画像を比較し,後述するコスト関数を計算する.

さらに,勾配法を用いて,コストを下げるようにランダム画像を更新する.

定められた学習回数だけランダム画像を更新し続けて,最終的に出力画像をえる. この時,出力画像はランダムに生成されてから,コストを下げる方向に更新され続け,結果として入力画像に近く,スタイル画像のスタイルに近い画像となる.

この時のコスト関数を図5に示す.

f:id:masamasah:20180922141829j:plain

JContentとJStyleについては次の章とその次の章で説明する.

αとβはhyper-parameterである.

ランダム画像は勾配法を用いて図6のように更新される.

f:id:masamasah:20180922141839j:plain

Content Cost Function

JContentについて.

JContentはすでに学習されているCNNに入力画像Cと出力画像Gを入力し浅すぎず深すぎないレイヤーのアクティベーションを用いて計算する(図7).

f:id:masamasah:20180922141849j:plain

比較的浅いレイヤーのアクティベーションを選んでいるため,プリミティブな特徴(エッジが立っているとか平面であるとか)が選択的に使われている.そのためこの値が小さければ,CとGは「同じようなものが写っている」ということができる.

Style Cost Function

次に,出力画像Gのスタイルをスタイル画像Sに近づけるためのコスト関数について説明する.

これには,スタイル関数Gkkを用いる. スタイル関数はCNNの畳み込み層について,チャネル方向に相関を計算したものである(図8).

f:id:masamasah:20180922141859j:plain

これは,異なる特徴(エッジが立っていたり平面だったりなど)がいかに同時に現れたり同時には現れなかったりするかといった情報であり,大まかにいうと画像のスタイルを代表する値になる.

このスタイル関数を用いて,レイヤーlでのJStyleを図9と表す.

f:id:masamasah:20180922141911j:plain

さらに,JStyleは各レイヤーで得られたJStyleを任意に加重して足し合わせて使うことができる(図10).

f:id:masamasah:20180922141922j:plain

λは任意の加重の値でありhyper-parameterである.

これがJStyleの定義である.

このJStyleと図7のJContentを用いて図5のコスト関数を計算することで,主力画像Gに対する勾配法を実行することができ,これによって画像Cをスタイル画像Sに似せた出力画像Gが得られるわけである.

1D and 3D Generalizations

これまで2次元の画像についてCNNを見てきたが,1Dや3Dなどのデータに対してもCNNを適用することは可能.詳細は割愛.

おわり.

Object detection

CouseraのDeepLearningのコースの学習メモ. CNNの第3週目. https://www.coursera.org/learn/convolutional-neural-networks/home/week/3

Object Localization

これまでは画像認識のタスクにチャレンジしてきた. 今週はlocalizationとdetectionのタスクにチャレンジする.

localizationは単数の物体を認識した上でその位置を検出する. Detectionは複数の物体を見つけてその位置を検出するといったことをする.

図1にイメージを示す.

f:id:masamasah:20180917143557j:plain

ここで,bx,byは検知したい物体の中心座標を示し,bhとbwは物体の縦幅と横幅を示す(図2).

f:id:masamasah:20180917143608j:plain

このタスクにおいて,教師のラベルは図3のように表すのが一般的である.

f:id:masamasah:20180917143618j:plain

pcは物体が存在するかしないかを示す確率をさす.また,cnはそれぞれnクラスのフラグである. c1=歩行者,c2=車,c3=バイクだとすると,車が存在するときは図4のaのような教師データに,何も存在しないときはbのようなデータになる.

f:id:masamasah:20180917143629j:plain

ここで?はどんな数値であっても気にしないのでどうでもいいよということを示す. つまり,物体がないときは,bx,byやcnなどはどんな値を取っていても無視することを意味している.

Landmark Detection

これまでは画像の中から特定の物体の位置を見つけていた. 表情認識や姿勢認識をするために,画像の中からあらかじめ定められた特徴点を見つけたいというタスクがある. 例えば,顔画像の中から,目尻と目頭を見つけたいといったようなタスクがある.

このような画像の中から特定の特徴点を見つけるタスクをランドマーク検出とよぶ.

図5にランドマーク検出のイメージを示す.

f:id:masamasah:20180917143639j:plain

Object Detection

画像の中から複数の物体の位置を検出するタスクを考える.

例えば画像の中から車を検出したい場合,一つの方法として図6に示すようなネットワークを考える.

f:id:masamasah:20180917143650j:plain

レーニングセットとして認識対象(ここでは車)を切り出した画像を正解の教師データとして用意し,これを正しく判定できるようにネットワークを学習する.

そのネットワークを用いてSlidingWindowDetectionをすることで画像の中から車の位置を検出することができる(図7).

f:id:masamasah:20180917143701j:plain

だが,この方法は計算コストが大きく,時間がかかるという問題を抱えている.

次の章ではこれを畳み込みによる実装に変換することで,計算量を大きく削減する.

Convolutional Implementation of Sliding Windows

前述の通り,SlidingWindowDetectionを効率化する.

そのためにまず,FC層を畳み込み層で表現する方法を学ぶ必要がある.

FC層を畳み込み層で表現するには

図8のようなFC層を持つネットワークを考える.

f:id:masamasah:20180917143711j:plain

このFC層を畳み込み層で表現するには,図9のようにしてあげれば良い.

f:id:masamasah:20180917143723j:plain

つまり入力と同じ大きさのフィルタを用いることで,全結合が表現できるわけである.

Sliding Windowを効率化する

SlidignWindowのサイズが14×14×3だとすると,学習する対象のネットワークは図10(学習するネットワーク)のように表せる.

f:id:masamasah:20180917143731j:plain

これを,検知したい画像(16×16×3とする)にそのまま適用すると図10(検知するネットワーク)のように表せる.

ここで,最終的に得られた出力が,実はそれぞれのSlidingWindowを計算した結果になる(図11).

f:id:masamasah:20180917143743j:plain

Bounding Box Predictions

SlidingWindowより精度の高い方法としてYOLOアルゴリズムというものがある.

まず,YOLOアルゴリズムでは,学習対象のデータをいくつかの格子に切り分ける. 切り分けた格子にそれぞれ,ラベルをつける.

検知対象がc1=歩行者,c2=車,c3=バイクだとして,格子の数を3×3とすると図12のように表せる.

f:id:masamasah:20180917143859j:plain

ここで,格子にまたがって物体が存在するケースがありえるが,その際は,物体の中心点はどの格子にあるか?でラベルづけをする.

YOLOアルゴリズムでは図13のように,画像を入力にとって,上記のラベル(今回の例では3×3×8)を推定するネットワークの学習を行うわけである.

f:id:masamasah:20180917143909j:plain

この方法は格子に1つの物体のみが存在するときに動作する.

Intersection Over Union

検知がうまくいっているか評価する方法について述べる.

検知がうまくいっているかどうかについてはIoU(Intersection over Union)という尺度を用いて評価する.

図14のように検知領域と正解領域があったとする.

f:id:masamasah:20180917143918j:plain

この場合に,検知された領域と正解領域を足し合わせた広さをUnionと呼び,検知された領域と正解領域が重なっている広さをIntersectionとよぶこととする. IoUは図15のように表せる.

f:id:masamasah:20180917143928j:plain

つまり,正しく検知された領域が検知領域と正解領域を合わせた広さに対してどの程度あるのか?という尺度である.

一般的には,この尺度が0.5以上であれば検知が成功したとして評価することが多い.

Non-max Supperession

物体検知の際に,1つの物体に対して複数の領域が得られることがよくある. その中から十分に正しそうなものを残して他のを除外してあげる必要がある.

そのアルゴリズムがNon-max Supperessionである.

前章で述べたラベルの定義から,ラベルは検知領域についての情報と物体が存在する確率を持っている. まず,この物体が存在する確率が閾値より小さいものは,誤検知であるとみなして削除する. 次に,全ての領域の中から物体が存在する確率が最も高いものを見つける. その選ばれた領域と閾値以上の割合で重なっている領域はこれを除外する(IoRで0.5以上のものは削除するなど). その状態で再度物体が存在する確率が最も高い領域を見つけ,重なっている領域を削除するという動作を繰り返す.

その結果,重なっているものがなくなった時点で操作は完了し,不要な領域は削除された状態が得られる.

Anchor Boxes

1つのセグメントに複数の物体がある場合には,これまで議論してきたアルゴリズムは動作しない.これを動作させるためにAnchorBoxesというアイディアを見ていこう.

AnchorBoxesは,AnchorBoxというものを用意しておき,教師データ作成の際に用いる. AnchorBoxが図16に示す2つだとする.

f:id:masamasah:20180917143940j:plain

この時,画像をラベリングすると図17のようなイメージになる.

f:id:masamasah:20180917143950j:plain

つまり,画像の中のラベルづけ対象がAnchorBox1の形に近い場合はラベルの上半分に,AnchorBox2の形に近い場合はラベルの下半分としてラベルづけがされるわけである.

図17の例では歩行者はAnchorBox1の形に近しいため,ラベルの上半分に現れるし,車はAnchorBox2の形に近しいため,ラベルの下半分に現れる.

これはAnchorBoxが2つの時の例だが,一般化するとラベルは図18のような形になる

f:id:masamasah:20180917144002j:plain

YOLO Algorithm

YOLOアルゴリズムについてまとめる.

Training

学習データは複数の格子に分けられ,それぞれの格子についてラベルが作成される. ラベルはアンカーボックスの数と分類したいクラス数に依存し,図19のようになる.

f:id:masamasah:20180917144013j:plain

これを正解データとして教師データの画像が入力され,正解データを出力するようにネットワークが学習される.

Prediction

認識対象の画像が学習されたネットワークにinputされる. 得られた結果に対してnon-max supressionを行うことで誤検知されたデータを取り除き,所望の物体検出結果を得ることができる.

non-max supression

まず,物体が存在する確率が閾値を下回っているものについては除外する. 次に,物体が存在する確率が最大の領域を選択し,その領域と閾値以上のIoUがある領域を削除する. その状態で次に物体が存在する確率が大きい領域を選択し,同様に閾値以上のIoUがある領域を削除する. これを繰り返し,重なっている領域がなくなった時点で所望の結果を得ることができる.

Deep convolutional models: case studies

CouseraのDeeplearningのコースの学習メモ.

Case studies

今週はケーススタディを見て行く.

Why look at case stduies?

ネットワークを構築する上で,ほかの誰かが作ったネットワークのアイディアを知ることはとても有益だし,そのまま活用することもできる.

今回はComputerVisionの分野で成功を納めてきたネットワークを見て行くが,ComputerVisionの分野以外でも考え方などすごく参考になる部分があるので,ケーススタディは大切.

今週は

  • LeNet-5
  • AlexNet
  • VGG
  • ResNet
  • InceptionNet

を実例として見て行く.

Classic Networks

LeNet-5

これは,手書き文字の分類(グレースケール)の識別で大きな効果を発揮したネットワーク. ネットワークを図1に示す.

f:id:masamasah:20180915171847j:plain

約6万のパラメータがある,比較的小さいネットワーク.

図1を見るとわかるが,nHとnWといった縦横は層を超えるごとに小さくなっていき,nCといったチャネル数は増えて行くようにネットワークを構築することが一般的に取られる手法であり,設計時のガイドラインとなる.

AlexNet

画像認識で高い精度を出したネットワーク. 大体6千万パラメータがある中堅クラス.

図2にネットワークを示す.

f:id:masamasah:20180915171901j:plain

VGG-16

これまで見てきたように,hyperparameterがとても多い. hyperparameterのチューニングをほとんどしないで良いために,畳み込み層を3×3でstrideを1,sameパディングとして,マックスプーリング層のフィルタサイズを2×2でstrideを2と固定して用いるネットワークとしてVGGがある.

チャネル数も64=>128=>256=>512=>512とリーズナブルに選択されている.

図3にネットワークを示す.

f:id:masamasah:20180915171914j:plain

1億3800万ほどのパラメータがある非常に大きなネットワークになる.

ResNets

Residual block

ResNetはResidualBlock(残差ブロック)層を用いたネットワークである. まずは残差ブロックの説明から.

残差ブロックのイメージを図4に示す.

f:id:masamasah:20180915171929j:plain

通常のネットワークにショートカットする線を足したものを残差ブロックと呼ぶ.

これを行うと,レイヤーを深く深くして行くことができるという利点がある.

ResNetではなく通常のネットワークにおいて,レイヤーを深くして行くと,理論的にはトレーニングセットに対するエラーは単調減少するはずだが,実際には勾配消失を起こしてしまい,単調減少にならない. これが,ResNetを用いると解決でき,単調減少するようにできる.

これによって,レイヤーを深くすることで精度を高めたいという狙いを実現できる可能性が高まる.

レイヤー数とトレーニングセットに対する誤差のイメージを図5に示す.

f:id:masamasah:20180915171941j:plain

ではなぜこんな特徴になるのか? 次の章で見て行く.

Why ResNets work

Residual blockを数学的に記載すると図6のように示せる.

f:id:masamasah:20180915171953j:plain

ここで,勾配が仮に消失して0になっていた場合,図7のように数式が展開できる.

f:id:masamasah:20180915172005j:plain

つまり,勾配が消失して0になってしまうという最悪の状態であっても,その層がなかった場合と変わらない予測が可能になるわけである. 最悪のケースにまでいかない場合はモデルが意味のある知見を学び,それを持ってトレーニングセットに対するエラーが減少するのである.

Networks in Networks and 1 by 1 Convolutions

フィルタサイズが1のフィルタをかける. なんの意味があるのだろうか?

inputが1チャンネルだった場合は,ただ単に定数倍するだけで,意味はない. inputがNチャンネルになった場合は,チャネルにまたがってフィルタをかけ,それらを足し合わせるという動きになる.

f:id:masamasah:20180915172018j:plain

つまり,チャネルにまたがってニューラルネットワークのような計算をしてくれる.

さらに1×1のフィルタを複数チャネルかけることによって,inputのチャネル数を所望のチャネル数に増減させることが簡単にできる.

プーリングでは縦横のサイズを調整できるがチャネル数は調整できなかった. 1×1のフィルタは縦横のサイズは調整できないがチャネル数を調整できる方法と言える.

f:id:masamasah:20180915172029j:plain

Inception Network Motivation

CNNのパラメータはたくさんある. フィルタサイズをどうするのか,Maxプーリングをするのか. 選ぶのが大変だ.だったら,全部やってしまえばいいじゃないかというのがInception Networkのモチベーションである.

InceptionNetworkでは,異なるフィルタをかけたものを1つのoutputにまとめる. 図10のようなイメージで動く.

f:id:masamasah:20180915172040j:plain

これをすることで,hyperparameterの選択が不要になる. が,これは計算量が膨大になる.とてもとても大きい数になる.

これを解決するために,1×1フィルタを使った中間層(ボトルネック層と呼ぶ)を設けて計算量の削減を行う(図11).

f:id:masamasah:20180915172054j:plain

こんなことして性能に影響は出ないのか?と不安になるが,性能には大きく影響が出ないことがわかっており,有意義な手法となっている.

Inception Network

前の章のブロックを積み重ねたのがInceptionNetworkである.

Practival advices for using ConvNets

Using Open-Source Implementation

たくさんの種類のアーキテクチャを見てきたが,どれも複雑で,パラメータの設定などとても大変になる. アプリケーションに応用するためには,自分でここらへんの設定をするのではなく,GitHubとかに上がっているオープンソースの実装を活用すると良い.

GitHubからCloneしてくる方法とかの説明なので割愛.

Transfer Learning

ソースコードだけではなく,学習済みのモデルなんかもネットには上がっている. このモデルを使って転移学習をすることで,特定タスク向けのデータが少なかったとしても,精度の高い分類器を作れる可能性が広がる.

転移学習をする際に,どこからどこまでを学習済みのモデルを使って,どこからをFineTuningしていけば良いかは,持っているデータの量による.

データが少なければ最終層だけをFineTuningするなど,できるだけ深い層まで学習済みモデルで固定してしまう.

データ量が増えるにつれて,固定する層を減らし,深い層を学習するように調整して行く.

もしも大量のデータがあるのであれば初期値に学習済みモデルを使って,後は全て学習を進めて行くようなことも可能である.

データ量に応じた意思決定が必要になる.

Data Augmentation

データ拡張を行うことでデータ量を増やすことができる. 細かい話は割愛.

State of Computer Vision

ComputerVisionの研究から得られた知見を共有する.

まず,機械学習のモデルを育てる上で,2つの知識をシステムにinputする必要がある. 1つがラベル付きの教師データで,もう1つが人が手動で調整した特徴量である.

片方が多かったり優れていたりすれば,もう片方は少なくて良い. ラベル付き教師データが大量にあれば,人の調整した特徴量はなくても良い.

教師データが少なければ,必然的に人の調整した特徴量が必要になる. データが少ない際には,データ拡張や転移学習を行うことでデータ量を増やすことができる可能性があり,有力なオプションとなる.

また,可能であればオープンソースの実装を使うのは良い判断である. 論文で言われている構造やオープンソースで実装されているもの,公開されているモデルなどのデータをうまく使ってアプリケーションを構築しよう.

Osaka Mix Leap Study 特別編 - CTO Night KANSAI

Osaka Mix Leap Study 特別編 - CTO Night KANSAIに参加させていただいた.

【増枠】Osaka Mix Leap Study 特別編 - CTO Night KANSAI - connpass

うちにはCTOという役職はないが聞いたことはあるなー程度の知識であり,CTOという役割自体にはあまり興味がなかったが,ブレイクアウトセッションの「死の谷の先へ」に強く惹かれたので行ってみた.

結論から書くと,面白い話を聞けたし,CTOという職業自体に強く興味を持つようになったので,行ってよかったと思っている.

運営いただいたヤフーさんありがとうございました.

死の谷の先へ 〜 Yahoo!路線 混雑予測リリースまでの道程 〜

はじめに,今回の目的だったブレークアウトセッションを聴講した.

募集サイトにあった概要はこんな感じ.

研究開発の成果が具体的な事業化・製品化に結びつかないことが多々あるのですが、この研究開発と事業化の間にあるギャップを”死の谷”と呼びます。 路線サービスではその死の谷を乗り越え、研究成果をサービスの新機能(異常混雑予報)としてリリースすることができました。 しかし、そこまでの道程は決して平坦ではありませんでした。 今回は案件を通じて実際に経験した死の谷に焦点を当てながら、企画からリリースに至るまでの経緯を話したいと思います。 新しいことに挑戦したい、今まさに挑戦しようとしている方の参考になれば幸いです。

受講前に期待していた内容

これから自分がぶち当たることになるかもしれない死の谷について学んで,心構えを作る.

問題が起きた時に解決できるように,これは自分に固有の問題ではないと思えるように知っておきたい.

結論

期待していた内容が達成できたので,すごく満足感が高かった.

事例の中で3つの死の谷を乗り越えた体験談をお話ししてくれた. 3つとは以下の通り.

  • 共同研究開始時点
  • 担当者退職時点
  • 製品開発時点

特に共同研究開始時点と製品開発時点はリソースの確保という共通項があった.これを解消するためにどんな戦略をとったのか?というお話.

小さく初めて,成果が出そうであればそれを持って上司と相談する.製品化においても一度で全てをやりきろうとせずに,小さく作って大きく育てて行くリーンの考え方を持って行動する.

今となってはいろんな本でも見かけるし,定石的な進め方に感じるが,これを3年前から実践されていたというところがポイントなのかもしれない.

以前読んだ【「事業を造る人」の大研究】で言われているような内容を実践者から直接聞けた感じで,過去の読書体験が実践例と結びついた.

読書メモはこちら.http://masamasa.hatenadiary.jp/entry/2018/05/06/112624

いかに周囲の協力を得ていくか,賛同を得ていくかというのが悩みポイント.

質疑応答の中でも「モチベーションを保つために必要なことは?」に対して「時流が味方してくれたのでモチベーションが保ちやすかった」と回答されていた.それくらい周囲の賛同は大事なこと.

以下感想だが,いかにその時流を自分から作り出すか?もしくは見出すか?はたまたコントロールするか?という点については,僕自身まだわかっていない. どこかで真剣に考えないといけない自分の課題だなと思っている.

パネルディスカッション

エンジニアというキャリアの「魅力」と必要な「覚悟」は?

新しいものを生み出してユーザーに使ってもらうことが魅力というのが全体として共通していた.

覚悟についてもその裏返しで,エンジニアが新しいものを生み出し続けるから業界全体の変化し続けるスピードが早いわけで,キャッチアップするために学び続ける覚悟が必要というお話だった.

みんなが新しいものを作り続けることが原因で,みんながキャッチアップ大変って思ってるところがなんかこう,面白いと思った.

エンジニアリングは沼なのかもしれない.

エンジニアに向いている人とは?

魅力と覚悟に紐づいた話が多かった.

新しいもの好きで,キャッチアップして行くような人. モノづくりが好きで,それを使ってもらうことに喜びを感じる人たち.

向いている人っていうか,今エンジニアやってる人ってこういう人たちだよねーって言い換えても成立するようなお話.

CTOの役割とは?

業界の状況や会社のステージによってCTOの役割は様々だけど,技術って根っこがあった上でなんかする人たちって印象だった.

技術的な知見に基づいて,ビジネスについていろんなことを決めたり,ステークホルダーに説明したりする人たちって感じなのかな.

個人的に共感したのはヤフーのCTOの方がおっしゃっていた「非技術系の経営層に技術的な内容を理解してもらうためには,銀の弾丸なんてなくて,1on1で丁寧に説いて行く必要がある」という点だった.

正直,CTOは組織構造の上の方の人たちなので,その人たちの悩みとか仕事内容とか聞いても自分のスコープから外れてるんだろうなと思っていた.

けど,これは共感できる悩みだった.自分が感じている課題みたいなものを一個一個倒していった先にCTOというキャリアがあるのかもなーと漠然と思えた.

CTOの次のキャリアは?

みなさん共通していたのは学び続ける姿勢だった. 色々と熱い話だった.

最近,LIFE SHIFT的な話がそこかしこで聞こえてくる. もはや合意された未来予想図になってるんだろうなという印象を強めた.

流し読みしかしてないので,もう一度読み直したほうが良いかも.

質疑「CTOなのですが、部下の方が技術知識があるようになってきて自信がなくなってきました。どうしたらいいでしょうか。。」

CTOが常にトップである必要はないし,CTOが組織のキャップになってはよくない. そもそもCTOの役割としてエンジニアリング組織をマネージするってのもあるので,部下が育っているのはとても喜ばしいこと.

というのが一致していた回答だった.

が,個人的にはぽろっと出てきた「僕は負けたくないから勉強しますけどね」が印象的だった.ぽろっと出てきた言葉だけど,なんか凄みを感じた.

おわり.