Neural Network Console

ソニーが先に公開した、Neural Network Consoleで遊んでいる。ごくごく当たり前のモデルであればありがちな設定というのはある程度確立しているものがありその設定でいいだろう。しかし、それだけであると少し変化球を投げられると破綻する。結果、mnist +alpha で悶々とする事態は発生する。

例えば、文字と一緒にだれが書いたかモデルに組み込もうとすれば、文字種を増やして対応するとか弥縫策と思う対応はいくつも思いつくが仕組みとして組み込もうとすればどこかでモデルの構造に挑まざるを得ないだろう。そういったときに、現行のTensor FlowやCognitive Toolkit との格闘は正しいだろうかということになる。現在は、Deep Learning≒Python とみられていることもあり、半ばPython技能が必須に近くなっているがそれがいつまでも正しいだろうか。

ビジネス側の知見と、技術者の橋渡しができる超人がどんな現場でもいるとは限らない。というか、いないほうが多いだろう。技術者側がビジネス側にきちんと歩み寄れればいいがいつでも、どこでもとはいかないだろうと思っている。

実務におけるモデリング

TJOさんがなにやら、ためになる記事を書いているので乗ってみます。Let’s throwing Masakari.

汎化性能についてはそのままだと思います。基本的には、正にその通りです。ここで付け加えることは多くはないです。とはいえ、とはいえ、汎化性能でもそうなのですが、問題はどこまで求めるかですね。つまり、どこまで性能の引き上げを頑張るかです。

例えば、それがセールスとかのモデルであれば最終的なモデルの出来不出来の目安は売り上げとなるでしょう。まあ、売り上げに至るまでの細かい情報が取れる場合にはその辺の情報も加味されるかと思います。

ただ、モデルが外れることがそのまま、損失につながるような状況だと厄介です。当然ながら、モデルの結果が出るのは将来の話です。まあ、そういう場合にはモデルのモニターを通じて何らかのモデルの精度を損なうような事象が観測された場合にはリモデルの提案をするしかないかもしれません。まあ、すんなりいくかどうかは別としてですが。

まあ、そう考えると不安な事象をどうするかってことですね。例えば、モデルを作った段階で、CVとかで検証してそれなりのアウトプットが出たとしてゲインチャートなどで確認して形状の差異など不安を感じるものが出たときにどうジャッジするかとかになるのかなと思います。

モデルの解釈性と予測性のプライオリティは厄介です。両方、お客さんは取りたくなるからです。この辺は色々と厄介でございます。

う、いろいろ、表に出さないで書いたら、まったくとりとめがなくなった。

パーセプトロンによる分岐予測

PC Watchの後藤氏によるアーティクル “AMDの次世代CPUコア「ZEN」のニューラルネットワーク分岐予測機能“。注意すべきはCPUの分岐予測関連は完全に秘密のベールに包まれており、AMDが先行しているかどうかはよくわからないということに尽きる。AMDにしても殆どの情報は非公開でありほとんど情報はない。

恐らく、単層のパーセプトロンだろうってことぐらいしか、恐らくほとんど情報はないのではないか。ただ、実用上はいわゆるオンライン学習になっているだろうとも考えられる。ただ、そうすると学習したモデルの揮発からの保護はどうなっているのかという問題も生じる。一旦、学習させ尽くしてしまってコールドスタート時からはファクトリープリセットのモデルに戻すというのならばこの問題は生じないが。

ただ、パーセプトロンでも通常、過学習の問題は生じるので、コールドスタート時はファクトリープリセットのモデルに戻すというのも悪い発想ではないとも考えられる。

 

AIの「よくある誤解」10個、ガートナーが見解

さて、クリスマスです。細かい話をするのもないので、この発表から。

ガートナーの発表した、AIのよくある誤解はすごくわかりやすいです。

  1. すごく賢いAIが既に存在する。
  2. IBM Watsonのようなものや機械学習、深層学習を導入すれば、誰でもすぐに「すごいこと」ができる。
  3. AIと呼ばれる単一のテクノロジが存在する。
  4. AIを導入するとすぐに効果が出る。
  5. 「教師なし学習」は教えなくてよいため「教師あり学習」よりも優れている。
  6. ディープ・ラーニングが最強である。
  7. アルゴリズムをコンピュータ言語のように選べる。
  8. 誰でもがすぐに使えるAIがある。
  9. AIとはソフトウェア技術である。
  10. 結局、AIは使い物にならないため意味がない。

1.と3.はものすごく関連があり、機械学習という単一の物があるわけではなく、機械学習というのは複数の技術を括る一つの目線に過ぎないのだと思います。従って、機械学習と称する技術は複数の学問分野にまたがっています。

当然ながら、深層学習は最強でもなんでもなく、適切な分野を選べば力を発揮するアルゴリズムの一つです。選択を誤れば深層学習で何も得ることはかないません。

まあ、ガートナーと契約しているわけでもないので、全文は未見ですが、9はソフトウェア技術と限定してしまうとひどいことになるでしょうね。確かに。

 

Visual Studio Code で Stan 拡張を作ってみようとする

今日はVisual Studio Code Advent Calendar 24日目のはずです。さて、Visual Studio Codeを使っていて、はたと困ったのはStanの機能拡張がなかったことです。ないのならば作ってしまえホトドギスで作ってみようとしました。まず、開発環境を用意しようとしました、それほど長時間使うわけでもないし困ったらサクサク作り直したいので、Microsoft AzureからA1v2を1インスタンス用立てて作ります。Linux環境を作らないのは手っ取り早くリモートデスクトップでつなぎたいからです。

とりあえず、必要なものを考えてみます。まず、StanのテストはR上で行うことにして、RStanをベースにします。RのVisual Studio Codeの機能拡張は既にあるし、まあ、Visual StudioのR拡張でとりあえずなんとかなるだろうと。そして、qiitaのVisual Studio Code はじめての拡張機能開発を参考にして、以下の物を。

  • Windows Server 2016
  • Visual Studio 2017RC
  • Microsoft R Open
  • Visual Studio Code
  • node.js
  • git

さしあたり、コードのレポジトリをgithubに作って作業開始。

と思っていたら、以下の記述がLanguage Extension Guidelinesに。

Syntax highlighting, snippets, and smart bracket matching can be implemented declaratively with configuration files and don’t require writing any extension code.

どうやら、コードを書かずに目的を達成できそうである。今回は拡張機能を作るのが目的ではなく、あくまでStanのためのよりよい環境がほしいだけなので、楽ができるのは歓迎である。

さて、先ほどから語っているStanについて、少々触れておく。Stanはベイズ統計モデリングをするための一種のドメイン特化言語である。Rなどとことなり、ベイズ統計モデリングのためにあるので汎用の言語ではない。R用のStanパッケージであるRStanやPython用のPyStanと用いられることが多い。言語自体は最終的にCのコードになりコンパイルされる。

とりあえず、yeomanで雛形を出力させると、必要なファイルが入っているようなので無駄にはならなかった感じですね。あとは、ちまちまと予約語とかを整備していけばある程度使える形にできるのかな?

と、思ったら、Ivan Bocharov氏のstan-vscodeが。脱力感、漲る。

地味に便利なAzure DevTest Labs由来の自動シャットダウン

先日のMicrosoft Azureの機能拡張でDevTest Labs由来の自動シャットダウン機能が仮想マシンにつきました。この機能のリリース前はAzureの機能の一つであるAzure Automationを使って自動シャットダウンを実施する必要がありました。特に単価の高い、Hadoopなどのクラスターなどは確実にシャットダウンしないと金銭的に破滅しますので重要です。

この機能の設定はとても簡単です、管理支援機能であるAzure Automationの設定と比較しても簡単です。勿論、できることは限定されますが、自動シャットダウンというものを実現するには十分です。

インターフェイス上は仮想マシンのスケジュールのところにあります。

Screen shot of Azure Portal

Azure Machine LearningのNet#による深層学習と限界点

DeepLearning Advent Calendarの23日目と推定されます。LSTMとかは色々と間に合わなかったので、プランBにより別テーマで過去への巡礼をしてみます。

Microsoft Azureの機械学習のPaaSであるAzure Machine LearningにはNet#というDSLがありこれを使うことで深層学習をニューラルネットワークのモデルに盛り込むことができる。実際に、Cortana Inteligence Galleryには”Neural Network: Convolution and pooling deep net“というテンプレートが存在する。中身を見てみる。

Net#を使って、深層学習の実現ができるという話は早くは国内では2015年のde:codeで語られている。確か、セッション「実践Azure Machine Learning」だったかと思う。この中で録画分に含まれているかどうかは確認していないがちらりと語られていた。メモ的な記事としては2015年に「Azureでお手軽ディープラーニング」という記事がホクソエムのdichikaさんによって書かれている。

ただ、限界点もある。今となっては古典的な隠れ層1層くらいの誤差逆伝搬法で問題となった勾配の消失問題の解決として使われているいくつかの手法があるが。

  • Pre-training
  • Autoencoder
  • Dropout
  • Randomized weight

これらはNet#で記述するための仕様を欠いているため、隠れ層を深くすると問題が起きる可能性は否定できない。基本的には私が把握している限りではNet#の仕様で深層学習の実現に有用なのは活性化関数の一部と隠れ層のカスタマイズあたりであろうかと思われる。

とはいえ、データ加工のスキームをフローで書くことができるなど有用な点は数多くあり、活用可能な問題であればAzure Machine Learningで実現するのは悪いことではない。Power BIを組み合わせて可視化するのも面白いと思う。

参考文献

  1. MLP シリーズ “深層学習” 岡谷貴之著

分析者目線でF#なAzure Notebookにトライしてみる

この記事はF# Advent Calendarの19日目と推定されます。さてさて、F#の話です。

先日、Azure NotebooksがAzure Machine Learningから独立するような形でアップデートし、F#がAzure Notebooksで使えるようになりました。Azure NotebooksはJupyter Notebookベースの環境で現在、R、Python 2/3、F#が使えます。従って、F#環境をいろいろいじって色々確かめようと考えたわけです。主に、分析者目線で。

さて、この環境がどのような形でホストされているのか気になります。特に、分析者として使うならF# DataとかMath.NETとか使ってみたいですしね。環境の方は意外な形でわかりました。

#Rと参照を打った時に出た候補で環境に関してはもろばれと言ってよいかと思います。おそらく、.NET Coreとかで実現された.NET環境を何らかのLinux上に構築しているかと思います。

もともと、分析者目線でと始めたのですが、今のところ、F# Dataとか、Math.Net とかを参照設定するのに成功していないので、今のところはF#のテストコードを手軽に試すといったことしかできていません。

ただ、Azure Notebooks特にF#はまだ初期のプレビューにありますので、これからガンガンとリクエストを出していこうかと思います。

それでは。

追記

2017/01/13

Paket を使ってF#にライブラリを組み込むことが可能なようです。