エンジニアMのAI学習記録(2018年1月分)

2018年01月05日
こちらは、Webに関連するエンジニア向けの記事です。
当社のWeb関連技術の公開と採用活動のために掲載しています。

(2018年1月19日更新)

みなさんこんにちは、エンジニアのMです。
これは当社の技術やAIに興味のある方に向けた日誌になります。
今月も毎週更新していきます、よろしくお願いします。

1月4日

■ PHP

統計学は一旦置いておいて、PHP(+MySQL)について少し勉強する。
数式で疲れた頭をほぐすのに、プログラミング言語の入門書はちょうどいい。

  • PHP+MySQLマスターブック (ISBN978-4-8399-4759-0)

■ CPUに内在する脆弱性について

  • Intel Management Engineなどに8個の脆弱性が発見:PC Watch [リンク]

Intel MEに脆弱性が存在したという話は記憶に新しいが、今度はプロセッサの投機的実行(speculative execution)に関する脆弱性が見つかったという。

  • Intel製CPUに内在する脆弱性問題の根は深く「すべてのプロセッサが安全性と高速性を両立できない問題を抱える」との指摘:Gigazine [リンク]
  • Intel、AMD、ARMなどのCPUに深刻な脆弱性、影響を巡る報道で混乱広がる:マイナビニュース [リンク]
  • IntelなどのCPUに脆弱性を発見 業界各社が協力して対応を急ぐ:livedoor NEWS [リンク]
  • CPUにハッカー攻撃への脆弱性 テクノロジー各社が対応急ぐ:BBC [リンク]
  • Meltdown and Spectre [リンク]

今回の脆弱性は、「Meltdown」と「Spectre」と名付けられた2つであり、

  • Meltdown:1995年以降のほとんどのIntel製プロセッサ
  • Spectre:Intel、AMD、ARM各社のプロセッサ(事実上すべてのマイクロプロセッサに影響するとの記述も)

が内包するとのこと。
当初はIntel製プロセッサの問題との報道もあったようだが、実際にはARM、AMD製プロセッサにも影響するものであった。
Meltdownに関しては、2011年リリースのIntel製プロセッサでテストに成功したとのこと。
AMDの技術者は「AMD製CPUは投機的実行における推測的なメモリの参照が許可されていないためメルトダウンの影響を受けない」とのメッセージを発信している。
他方Spectreに関しては、「Meltdown and Spectre」ウェブページ内に「Spectreは悪用することも難しいが、対策することも難しい」との記述がある。
こちらについては情報がほとんど出ていないので、続報を待つ必要がありそうだ。

■ 脆弱性の影響は?

Linux用のMeltdownへの対策パッチを適用すると、プロセッサの性能が5~30%低下すると言われている。
一般ユーザーへの影響は、この性能低下が一番身近な問題となろう。
AMD製プロセッサの性能向上が著しい中、Intel MEに続き、より深刻な脆弱性「Meltdown」が発覚したことはIntelにとって大きな痛手だ。
WPA2の脆弱性が発覚したときも大きな話題となったが、今年もセキュリティ関係の話題は(悪い意味で)尽きないようである。

1月5日

■ PHP

「Meltdown」と「Spectre」を調べていたらあまり進まなかったので、今日は入門書を終わらせるつもりで進める。

■ CPU脆弱性に関する追記

情報がかなり集まって来ているようなので、追記する。

  • Meltdown and Spectre FAQ: Fix for Intel CPU flaws could slow down PCs and Macs : PCWorld [リンク]

Windowsへのパッチ前後の比較がこちらの動画内で紹介されているが、SSDの処理性能低下が目立つ程度だ。
Macへのパッチ適用による影響は軽微との記事もある。
Linuxの開発者Linux Torvaldsもメーリングリストで、「あなたが行う処理に依存する。一部の負荷は、ユーザー空間内で全て処理される限り、ほとんど影響しない。」としている。
ここで一つ重要なのはPCID(Process-context identifier)と呼ばれる技術にプロセッサが対応しているか否かである。この技術は、Haswell(4th-gen)以降のIntel製プロセッサであれば使用可能とのこと。「古いIntelプロセッサは大きく影響を受ける可能性がある」という報道は、これが関係するものと思われる。
ここまでで、比較的新しいシステムを使う一般ユーザーはほぼ影響を受けないと断言できそうだ。
しかし、一部のアプリケーション(特に仮想化タスクやデータセンター、クラウドワークロード)は他のアプリケーションより影響を受けるという。
これらを活用している企業にとっては、実際にどれほどの影響があるのか、さらなる情報が必要だ。


※様々な記事の情報を総合した上で記述していますが、現時点での情報なので誤りが含まれる可能性があります。常に最新の情報を確認するようにしてください。


私が普段使っているプロセッサに、こういった脆弱性が見つかったということが衝撃だったので納得いくまで調べてみた。


※1/10追記:

  • 投機実行の脆弱性修正、Haswell世代以前では性能への影響大:PC Watch[リンク]
  • Understanding the performance impact of Spectre and Meltdown mitigations on Windows Systems : Microsoft Secure[リンク]

「Windows 7」, 「Windows 8」はユーザーカーネルとのやり取りが多いレガシーなOSであるため、CPUの世代を問わず「Windows 10」利用時と比べパフォーマンスが低下する。
また「Haswell」(第4世代、例:Intel i7-4790K)及びそれ以前(Core2、第3世代までのCore iシリーズなど)のCPUでは「Windows 10」を利用していても、一部のユーザーで体感できる程度のパフォーマンス低下が起きる。「Windows 7」、「Windows 8」と「Haswell」以前のCPUの組合せが最も悪く、大部分のユーザーが体感できるほどのパフォーマンス低下が起きる。
わたしは、

  • Windows 7 or 8で「5%」(Windows 10 を基準として)
  • Haswell 以前のCPUで「15%」or それより後のCPUで「5%」

くらい劣化するのではと予想する(ワークロードによってはそれ以上)。
最悪のケースに該当する方は、実際の使用感を確認した上でPCの更新を検討したほうがいいかもしれない。


1月9日

■ プリンタの調子が悪い

ネットワーク経由での印刷が遅い(なかなか開始されない)、無意味な文字列が印刷される、といった不具合に見舞われる。
ケーブルを繋ぎ直した後に再起動したところ問題は起きなくなったが、また起きないとも限らない。
プリンタの故障、修理に関して、互換インク・トナーの性能を比較検証したレポートが出てきたので紹介したいと思う。

  • 【レポート】キヤノンレーザープリンタ ロシア仕向けトナーカートリッジ 印刷比較試験:アリオン [リンク]
  • 【レポート】キヤノンフォトプリンタ インクカセット・用紙 ベンチマーク試験:アリオン [リンク]

性能に顕著な差が現れているのがわかる。
プリンタはインク代で回収するビジネスモデルであることはよく知られている。
値段相応かはさておき、純正品の性能は十分に高いものであることは確かだろう。
不自然な安さには必ず訳がある。「安かろう悪かろう」である。

1月10日

■ WindowsUpdateに脆弱性対策パッチが来ていたので適用してみた

このパッチによって一般的な用途で一番影響を受けると言えるのが、メモリ、ストレージの操作であった。
そこで予め確保しておいた「7-zip」のベンチマーク結果を比較したところ、平均で5%程度の性能低下が見られた。
圧縮時に一瞬速度が半減する挙動が見られるなど、パッチの影響を感じるものであった。
また、日頃から「PyCharm」で小説生成モデルの学習を回しているのだが、チェックポイントからの再開が遅くなったように感じる。
元々仮想メモリも含めて大量にメモリを消費していたので、「用途による」部分に該当したと言えるか。

■ 機械学習に絡む線形代数の知識についておさらい

しばらく横道に逸れていたので、機械学習に関する知識の復習をする。
記憶の薄いところについては、重点的に確認する。

1月11日

■ 機械学習や分析手法の復習

線形代数の復習をざっくりと終わらせたところで、また機械学習について忘れている部分を思い出す。
ある程度間を置きつつ振り返ることで、知識を染み込ませていければと思う。

1月12日

■ CPU脆弱性に関する補足

  • AMD,「CPUの脆弱性」に対策するマイクロコードのリリースを予告:4gamer [リンク]

Variant2への対策をAMDも行うということで、AMD製プロセッサにおいても性能低下が起きると記事では述べられている。
ただし原文には「optional microcode」とあるので、主に万が一に備えるためのサーバー管理者、企業向けと考えることもできるだろう。
以前にAMDは悪用は困難との見解を示していたが、ユーザーの不安を取り除くためにオプションを用意するという姿勢は好感が持てる。


※オプションということでも、私個人としてはセキュリティリスクを最小にするために適用することをおすすめする。AI時代のセキュリティリスクは未知数な部分が多い。


■ 引き続き機械学習や関連分野の復習

引き続き復習をしていく。
便利なウェブサービスに実装の大部分を委ねることになったとしても、基礎的な部分についてはやはり理解しておかなければならないだろう。


1月15日

■ 情報理論についても軽く触れる

情報理論の範囲で、機械学習などに関連のある部分について調べる。
情報理論の一部については以前に少し勉強したことがあるので、今更ながらの確認作業といったところだ。
以下は特に参考になったと感じた記事のリンクである。

  • 情報理論を視覚的に理解する (1/4) :POSTD [リンク]

1月16日

■ 機械学習の復習&Kerasについて調べる

ある程度機械学習について復習が終わった後で、Kerasについて調べてみようと思う。
既存の手法をそのまま扱っていくことのほうが多いと思われるので、少ない記述量で検証できるKerasは覚えておいて良さそうだと感じた。
元々、KerasはTheanoやTensorFlowをバックエンドとして動くものという知識はあった。
今はTensorFlowとの統合も進んでいて、TensorFlowを入れるだけで tf.keras からアクセスできるようになっているらしい(確かにAPIドキュメントを見た時にあった)。

■ TensorFlow更新

TensorFlowに統合されたKerasを使おうとバージョンを確認したところ、1.5.0rc1がリリースされていたので更新する。
バージョンを 1.3 から上げるのを忘れていたことも分かったので、この機会にRC版まで1.4を飛ばして上げてしまう。
TensorFlow 1.5.0rc1 を使用するためには、

  • CUDA 9.0
  • cuDNN 7

のダウンロードも必要となる。少々手間取ったが無事に動作することを確認した。

1月17日

■ 花の画像分類をしてみる

kaggleで見つけてきたデータセットを使って、画像分類をさせてみる。
データがJpeg形式で画像サイズもまちまちなので、学習に使えるように処理しなければならない。

TensorFlowのCIFAR-10用チュートリアルを出来る限り使いまわして学習させたいので、そのフォーマットに則ったバイナリファイルを作ることにする。
どういう挙動をするか知らない関数が多数入っているので、下手にいじると泥沼になると判断した。

■ 成果

データバイナリの生成にだいぶ手間取ったがCIFAR-10用コードに放り込むことができた。
そこでlossがNaNになる問題が発生して頭を悩ませたが、こちらで値を変更していたNUM_CLASSESを5から10に戻したら解決した。
10と100で使う想定のもので、10未満の値ではうまく動かなくなるのかもしれない。
未使用の5クラスへの出力が無くなる方向で学習は進むので、これでも問題は無い。

1月18日

■ 昨日の続き

昨日のバイナリデータ作成コードを、テスト用データの分割をするように改変した。とりあえず、1クラスあたり100個をテストデータ側に振り分けた。
32×32~128×128まで4種類のバイナリデータを用意した。
それぞれについて十分な時間を与えて検証していく。
元々のデータセットは写真が雑多に詰め込まれている(人が写っていたり、花が小さすぎたりする)ので、私が見ても怪しいものが割とある。
それも踏まえた上で、分類精度を確認していく。

  • 32×32 : Step 100K : Precision 0.736
  • 64×64 : Step 22K : Precision 0.801
  • 96×96 : Step 22K : Precision 0.809
  • 128×128 : Step 21K : Precision 0.809

CIFAR-10と違い、花という同じカテゴリ内で品種を見分けるタスクなので、32×32では画像サイズが足りていない可能性が高い。
判別不可能なデータも混じっていると考えれば、それなりの精度か。

■ 大きい画像データに対して層数を増やして試す

conv, pool, normの1セットを追加して、学習にどういう影響があるか試してみる。
単に追加するだけでは変化がなかったので、以下の基準でデータを除外するところから手をつける。

  • 花が小さくしか映っていない
  • 花以外の要素が多い
  • ぼやけている
  • データを正方形に整形するときに花が消える

4000枚程度の数で、学習に不適な画像が混じっていると影響が大きいのではと考えられる。
モデル適用時にどういうデータを入力するかによって、許されるデータ整理の範囲は変わってくる。この場合は、ある程度きれいなデータが入力されることを前提とした学習となる。

1月19日

■ 改善できそうな部分をいろいろいじる

Learning Rateの減衰がほぼ機能していなかった点や、バッチサイズ変更などの調整をして、昨日整理したデータで学習させる。
学習速度と精度のバランスを考えて、64×64と96×96の画像を使用する。

■ Lossの値が途中でNaNになる問題

試行錯誤の過程で、ある程度学習が進んだとき急にLossの値が跳ね上がる現象に遭遇した。
RNNを使ったモデルでPreprexityがNaNになったことはあったが、それとは何か違う現象のように思える。

■ 経過

  • データ選別後64×64 : Step 21500 : Loss < 0.3 : Precision = 0.840
  • データ選別後96×96 : Step 52000 : Loss < 0.2 : Precision = 0.855

過学習の傾向が表れる前の数字を示している。
Learning Rateが減衰し始める前の段階でも、データ選別前の学習経過より5%程度高い精度を示していた。
テストデータに振り分ける数は変えずに、学習用データの数だけ700個ほど減らした状態で改善が見られたので、前処理の重要さが理解できる。
あとは大きいサイズの画像に合わせたモデルに修正できれば良かったのだが、突然Loss値がNaNになる問題が厄介だ。


この記事が気に入ったら
いいね ! しよう

フォームズでは無料でメールフォームを作ることができます
メールフォームとは、フォームに入力された情報をメールで送るサービスです。問い合わせの受付や申し込み、アンケートなどに幅広く利用できます。