Self-Attentionの良記事 “Attention Is All You Need (Transformer)”

Encoder-Decoderで主に使われていて、GANなどにも応用されているAttention構造を勉強しようと思って見つけた良記事です。

論文解説 Attention Is All You Need (Transformer)

 

元論文 Attention Is All You Need (Transformer)

 

個人的に詰まった点はSelf-Attentionについてです。

『自己注意 (Self-Attention) では Query,Key,Valueは全て同じ場所 (Self) から来る.例えばエンコーダの Query,Key,Valueはすべて下の隠れ層から来る.自己注意はある位置の出力を求めるのに下の隠れ層の全ての位置を参照できる』の部分を誤解していました。

つまり、n番目のLayerでは、i<nについて総当たりでi番目Layerとn番目Layerとの間でAttentionを取得するということみたいです。

Attentionの取得方法は内積がメインとのこと。手前の層でどこに特徴が強く出ているのか(≒注目すべき箇所がどこにあるのか)のヒントをもらうわけですね。

 

DCGANについて元論文を読みながら再整理

 

2年ほど前からブーム真っ最中のGANについて、丁寧に振り返りを使用というのが本記事の目的です。まとめサイトからの引用ではなくちゃんと元論文を読むことをポリシーとします。

 


そもそもDCGANとは

DCGAN(Deep Convolutional Generative Adversarial Networks)

簡単にいうと畳み込みニューラルネットワークを適用したGAN。論文ではネットワーク設計の注意点や特徴が細かく定義されている。

(論文)
Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (2015) https://arxiv.org/abs/1511.06434

 


DCGANのネットワーク構造の特徴

pooling層をConvolutions層(strideあり)に置き換える

  • pooling層をConvolutions層に置き換える(stride数をうまく調整。poolingが2×2で実施されるなら、stride=2とすれば出力のサイズは等しくなる)。
  • replaces deterministic spatial pooling functions (such as maxpooling) with strided convolutions, allowing the network to learn its own spatial downsampling.

  • Generatorではzから画像サイズと同等サイズの出力にアップサンプリングしないといけないのでDeconvolution(正式名称:fractionally-strided convolutions)をする。これは元となる特徴マップを拡大してから畳み込むことでサイズを大きくする処理。

バッチノルムを使用

  • バッチノルムを挟んだ方が、初期値問題や購買消失問題が生じにくく、学習がスムーズになる
  • This helps deal with training problems that arise due to poor initialization and helps gradient flow in deeper models

  • ただし、全層に適用するとモデルが不安定になった。
  • GeneratorのINPUTとDiscriminatorのOUTPUTには適用しいようにしたら解決したとのこと(Why?)
  • Directly applying batchnorm to all layers however, resulted in sample oscillation and model instability. This was avoided by not applying batchnorm to the generator output layer and the discriminator input layer.

Full-Conectionをなるべく省く。

  • 学習安定性の観点でFull-ConectionよりもGlobal-Average-Poolingが広く使われているのと同じ考え方
  • Global-Average-Poolingについてはコチラを参照(https://qiita.com/mine820/items/1e49bca6d215ce88594a)
  • Second is the trend towards eliminating fully connected layers on top of convolutional features. The strongest example of this is global average pooling which has been utilized in state of the art image classification models (Mordvintsev et al.).

  • ただし、Generatorとzをinputする部分と、Discriminatorの判定結果0..1を出力する部分では全結合した方が良い結果が得られた。
  • A middle ground of directly connecting the highest convolutional features to the input and output respectively of the generator and discriminator worked well.

GeneratorではReLUを活性化関数として使用。ただし出力層のみtanh。

  • 学習が早いということで、出力層では有界の活性化関数を推奨している。
  • We observed that using a bounded activation allowed the model to learn more quickly to saturate and cover the color space of the training distribution.

  • そもそも画像(例:RGBの場合は0~255)を出力するのだから活性化関数が有界じゃないと面倒でしょ?という気もする

DiscriminatorではLeakyReLUを使用。

  • 理由には「従来手法がそれでうまくいってるから」程度しか書かれていない
  • Within the discriminator we found the leaky rectified activation (Maas et al., 2013) (Xu et al., 2015) to work well, especially for higher resolution modeling.

 


やー、なかなか直感的には「なるほど」と思っても、うまく説明しきれないですね。

Jupyterでpickleを読み込み過ぎてメモリエラー

pickleは便利ですが、ついつい巨大ファイルを読み込みすぎるとメモリエラーが発生します。

Jupyterでは画面上では [*] のままですが、実はメモリ問題で停止しているという場面が珍しくありません。

対策は多々有りますが、簡単にできるのは次の2つが挙げられます。

①変数名を使いまわして上書きするようにする

②dtype=np.float32 で読み込む

試してみてください。

 

 

ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory

 

TensorFlowの1.5以降などを使うときに、CUDAのバージョンが9.0でないと次のようなエラーが出ます

 

私はCUDA6.0だったので、おとなしくTensorFlowを1.4に戻して解決させました

Python2で生成した.pklをPython3で読み込む時のエラー ’ascii’ codec can’t decode byte 0x9b

python2とpython3ではちょいちょい互換性のない場面がります

PKLファイルの生成と読込もその1つ

入手したPKLファイルを読み込むとき、

python2ではうまくいっても、python3では次のエラーが出ることが有ります

この場合は次のようにすればOK

 

史上初の自動運転による死亡事故 2018年3月18日@アリゾナ

2018年3月18日にアリゾナで史上初の自動運転による死亡事故が発生。自動運転界隈にとってショッキングな事件とされており、今もかなり話題になっているので内容を調べてみた。

 


東洋経済

アメリカ現地時間の3月18日夜、ライドシェアリング大手の米ウーバー(Uber)がアリゾナ州テンピで行っていた完全自動運転の実証試験中に歩行者の女性をはねた。女性は病院に搬送されたが死亡が確認された。

これを受けてウーバーは、アリゾナ州、カリフォルニア州、そしてオハイオ州で実施してきた公道での完全自動運転の走行テストを中止したと発表した。

 

今回の事故を受けて『開発途上の自動運転技術で公道を走らせるのはやっぱり危ない!』という声が大きくなりそうですし、まず最初に予想された展開がこれですね。もちろん必要な対応ですが、ここまでは形式的・儀式的な対応とも解釈できます。

 


日本経済新聞

地元警察は歩行者が急に飛び出し、人間でも避けるのが難しい事故だったとみている。

車両は時速64キロメートル以下で自動走行していたとみられ、衝突直前に減速した形跡はなかった。雨や雪は降っておらず、走行が難しい気象条件でもなかった。

運転はかなり安全重視だ。法定速度内で走るようプログラムされており、スピード違反はありえない。基本的には常に道を譲る設定となっている。

 

このあたりからずいぶんと擁護的になっています。つまり『自動運転の特別な事故』ではなく『ただの事故』にするための論に見えます。『自動運転だから』ではなく『歩行者が飛び出したから』というロジックを成立させることで、事故過失割合を自動運転側から取り除こうというストーリーですね。

 


日本経済新聞

自動運転機能が作動中で、運転席には監督者も乗っていた。

自動運転機能+監督者があったにもかかわらず事故が起きたとなると、誰の過失なのか本当にわからなくなってきますね。監督者という登場人物の追加によって、さらなる擁護の予防線として歩行者の過失でもなく自動運転技術の過失でもなく、同乗していた監督者の過失になるというストーリー展開の可能性も浮上します。

 


 

誰がどの立場をとるのか今は不明ですが、自動運転は操縦技術以外にも倫理と責任の問題に必ずぶつかると言われています。今回の事故によってどのように話が進んでいくのか注目です。

 

PRMU企画セッション2018の資料が深層学習入門編としてとてもわかりやすい

電子情報通信学会の総合大会@東京電機大学に参加してきました。

同時開催されたPRMU企画セッション『人工知能・深層学習の実世界応用』にてご講演されたシモラセ・エドガーさん@早稲田大学の資料が非常にわかりやすかったので備忘録としてまとめます。

まとめますというか、一般公開されているのでリンク先を見てもらえればいいのですが。

シモセラ・エドガーさんによるpdf資料

企画セッションのサイト

 


セッション中に”イイネ!!” と思った発言集

・ディープラーニングは万能ではない、問題を選ぶ必要あり

・パラメータは学習で決まるもの、ハイパーパラメータは人間が経験で決めるもの

・深層学習による自動的な特徴量抽出によってヒューリスティックを避けられる

・非線形の活性化関数をはさむことであらゆる計算式が近似できる(↓↓ 例えばこれ Wikipediaより)

・Adadeltaとバッチ正規化はとてもオススメ

・モデルや学習では解像度を下げることが重要

・TensorFlowは静的と動的なグラフが可能で、生産に焦点をあててる (←そうなの!?と驚いたけど、いつの間にか動的ネットワーク生成に対応したTensorFlowFoldってのが登場してたようです)

 


資料中で引用されていたAlec Radfordさんによる学習率の違いを示したアニメーションが面白かったです

 

マーケットインとプロダクトアウト

マーケティングを勉強してれば必ず耳にする「マーケットインとプロダクトアウト」について簡単にまとめます。


プロダクトアウト

・技術ありきの戦略。
・企業側の思想に合わせた開発。
・提供側の発想で商品開発を行うこと

スティーブジョブズの有名な言葉に「多くの場合、人は形にして見せて貰うまで自分は何が欲しいのかわからないものだ」とあるように、イノベーションを起こすにはプロダクトアウト観点は必須です。

「もし顧客に、彼らの望むものを聞いていたら、彼らは『もっと速い馬が欲しい』と答えていただろう。」というヘンリーフォードの言葉もありますね。

なによりプロダクトアウトのいい点は、技術起点の開発のため他社に真似されにくい製品やサービスを世に送り出すことに長けている点です。


マーケットイン

・顧客ありきの戦略。
・売れるものを創ろうとする開発。
・顧客側の発想で商品開発を行うこと。

顧客要望を無視してやりたい開発だけを進めることは独りよがり、また、博打のようなもので、マーケットインの視点が堅実な利益へとつながります。


筆者の意見

ロードローラーさんの意見としては、やはり自身が技術者ということもありプロダクトアプトの視点が強いですね。他社に真似されてコモディティ化されると価格競争にしかならないので。

マーケットインを主体で進めるとしたら、市場で1番乗りになることを目指し、他社が追いかけてきたころには次のマーケットを見つける機動力を持つ必要がると思います。


注意点

マーケットインとプロダクトアウトは対立する思想ではなく、両方の考え方を同時に適用することは可能です。むしろ同時に持つべきです。

PAC学習とVC理論

お久しぶりです、ロードローラーです。最近は7月のICMLに参加すべく勉強の日々を過ごしています。

ディープラーニングをあれこれとやって知ったつもりになっていましたが、ディープラーニングは機械学習の一部でしかなく(さらに言うならニューラルネットワーク手法の1つでしかない)、まだまだ勉強することは山のようにあります。

そんな中で、本日は機会学習のPAC学習とVC理論を調べました


PAC学習

参考サイト:朱鷺の杜Wiki

パラメータ:入力の誤差 ϵ,信頼度 δ,学習する概念の複雑さの上限 s

学習する概念についてのエラーがたかだか ϵ である確率が 1δ より大きくなるような仮説を出力できるアルゴリズムが存在するとき PAC学習可能 (probably approximately correct learnable). こうした学習問題を扱うのがPAC学習 (probably approximately correct learning)

さらに,1/ϵ1/δs について,計算時間が多項式時間で抑えられるとき,多項式時間PAC学習可能であるという.


こちらでもわかりやすくまとめられています

 

~要約~

PAC学習のモチベーションは『 まぁまぁ良い学習をするためにどの程度学習データが必要か見定めたい 』こと。

仮説集合𝐻(≒分類モデル)において『汎化誤差が𝜖より大きい,かつ,ℓ個の訓練データ に無矛盾な仮説を選択してしまう確率を𝛿以下に抑 えたい』とき、すなわち危険率𝛿以下で汎化誤差が 高々𝜖の仮説を学習するために必要な訓練デー タは次の式で求められる

問題点が2つあり、1つ目は思った以上に非常に大きい数値が算出されてしまうこと、2つ目は仮説集合𝐻(≒分類モデル)が無限の場合に対応できないこと。

実際問題、パラメータ数次第で分類モデルの構築方法は無限に考えられるので(だからパラメータチューニングが難しい)、仮説集合Hが有限となるシチュエーションは限られています。


VC次元による問題解決

仮説集合Hが有限でなければ先ほどの計算式のうち|H|が∞となり、必要な訓練データ数ℓも∞に発散してしまいます。そこでVC次元という考えを導入して、仮説集合HではなくVC次元数dによって下記式から必要な訓練データ数にあたりをつけます。

さて、それではVC次元とは何なのか??朱鷺の杜Wikiに再登場して頂きましょう。勝手に私が要約した内容が以下です。

・shatterするとは,点集合のそれぞれの点にどのようにラベルをつけても,それらの点を分離するような関数(≒分類モデル)がその仮説集合𝐻に含まれること.

・n個の点に対して,任意の配置とラベルであってもshatterできるような関数があり、それ以上点を増やすとshatterできなくなるとき,その関数(≒分類モデル)のVC次元は n.


ICML2017でも研究対象に

パラメータ再利用の転移学習時のリスクを算出するために、PAC学習やVC次元が利用された研究があったようです。

論文:
Risk Bounds for Transferring Representations With and Without Fine-Tuning

ちょっと理解するのが難しそうなので、これはまた今度で・・・・←