いっしきまさひこBLOG

Web制作関連、プログラミング関連、旅行記録などなど。

2019年の自分戦略(機械学習 & ディープラーニング)

今回は「決意表明・所信表明」的なものを書いてみました。有言実行を頑張ろうと思います。

Deep Insider における仕事の現状

2019年も1カ月が過ぎました。わたしの今の仕事は、「Deep Insider: 機械学習エンジニアを目指す人~初中級者のための技術情報サイト」の編集長です。このサイトを2018年4月16日にオープンしてから、早くも約10カ月目です。Google検索からの流入が大きいと思うのですが、Deep Insiderの各記事のページビューも上がってきており、各記事の閲覧時間も約30分ほどでしっかりと読まれているようで、まずまずの成果が出ているのかと思います。

Deep Insiderは、当初、「デベロッパー寄り」の読者像をイメージしてコンテンツを展開していました。現在の好調はそのころの成果に寄るところが大きいと思います。9月~11月ごろには記事展開方針に調整が入り、「エンジニアの素養はある程度持つが、機械学習やディープラーニングはまったく初めて取り組む、幅広い層の人材」を読者ターゲットに、より一段優しい内容のコンテンツを作成し始めました。

それが、下記の『機械学習 & ディープラーニング入門』連載群です。

これらを4カ月ほどかけて執筆しました。若干、急いで書いて殴り書きの部分があるので、問題ないか丁寧に見直しながら、順次公開していっています。目標としては、4月になる前にすべてを公開し終わりたいと思っています。

「機械学習」や「ディープラーニング」のコンテンツで思うこと

わたし自身は、もともとデベロッパー系のWeb編集者&ライターであり、C#を中心にプログラミングを20年近くやってきました。2017年ごろから、機械学習やディープラーニングを徐々に学び始めて約2年間になります。今は、データサイエンティストや機械学習エンジニアのように、イベントに参加して情報を収集しています。

そこで感じるのは、デベロッパーは昔はJava、少し前はRuby、今はPython?など、ズブの素人から学べる雰囲気があり、実際にプログラミングやWeb制作などに手を出す人は非常に幅広いということです。だから書籍などのコンテンツも、本当に中学生や小学生でも学べるようなレベルから解説しているものが多くあるのではないかと思います。

一方、機械学習やディープラーニングは学術的な雰囲気があり、特に数学が苦手な人など、ズブの素人はあまり手を出していないという気がしています。デベロッパーから機械学習エンジニアやデータサイエンティストへの転身も、想像していたよりは多くない気がしています。そのせいか、より教科書的で、厳密にまとめられた書籍が、好まれているのかなと考えています。逆に言うと、中学生や小学生でも学べるようなレベルから解説しているものは少ないのではないでしょうか。

Deep Insider編集部の中で喧喧諤諤の議論があって、上記のような連載群をわたし自身が執筆することになりましたが、「機械学習」や「ディープラーニング」のコンテンツという観点で、かなりオリジナルな立ち位置を確保できたのではないか、と自分のことながら考えています。しかも、概要の概要から、Python、本当に初めての基礎実習までを、1人の筆者で一気通貫で執筆できたのは、個人的にも本当にラッキーだったと思っています。

「機械学習 ディープラーニング 入門」をわたしの代名詞に

冒頭でGoogle検索の話を書きましたが、上位のページ(中には1位)の記事もちらほらとあり、「機械学習 ディープラーニング 入門」を検索すると上記の連載群がヒットするようになりました。

わたし自身の経歴では、2003年からC#を扱い初めて2017年までの14年間、C#関連の記事を出し続けました。わたしを知っている人は「C#の人」と理解しているケースが多いです。その強烈にこびりついたラベルを、2019年、剥がしに掛かりたいと思っています。

つまり、これからは「『機械学習 ディープラーニング 入門』でググれ」を自己紹介に使っていこうと(※とある「C#でググれ」の人のパクリです……)。

今から、検索キーワード長すぎだけど「機械学習 ディープラーニング 入門」の人となりますので、今後ともよろしくお願いいたします。

Microsoft MVPは更新しないつもり

こちらの記事:「Microsoft MVP を12年連続受賞。Visual Studio and Development Technologies [2018-2019] カテゴリ - いっしきまさひこBLOG」にあるように、2007年からC#に関連するカテゴリでMicrosoft MVPをなんとか受賞してきました。しかし今後のわたしにとって、このラベリングは逆効果になるかなと思っています。

もちろんMicrosoft MVPにもAIカテゴリがあり、それを目指してもよいかもしれません。しかしながら、やりたいことをやって結果的に受賞したのであればよいですが、受賞を目指して何かをやるのはおかしいかなと思っています。

マイクロソフト技術で「機械学習」や「ディープラーニング」というと、確かにCNTK(Cognitive Toolkit)がありますね。しかし、TensorFlow/Keras、Chainer、PyTorchなどの有力候補がある中、CNTKになかなか触手が伸びないし、そもそもマイクロソフトはCNTKを諦めたのではないかと想像しています(※そう思った理由はありますが、ここはパブリックな場なので書くのはやめておきます)。

マイクロソフトは、CNTKよりも、C#で機械学習ができる「ML.NET | Machine Learning made for .NET」を押しているとわたしは見ています。ML.NETはわたしも試してみました。しかしまだ発展途上で、「えっ、これもできないのか」など思ったこともあり、記事にして広く紹介したい、という気持ちにはなれていません。

ML.NETもそうですが、マイクロソフトが見ているのはデベロッパーや既存のエンタープライズ向けベンダーであり、データサイエンティスト/機械学習エンジニアやデータ分析の企業ではないと感じています。今のマイクロソフトの売りはAzureであり、AIという分野ではCognitive Servicesを一番強く押していると思います。Cognitive Servicesは確かに確実に結果が出せる学習済みモデルであり、何らかのシステムに組み込むのであれば非常に便利です。でも、それこそがデベロッパー目線だと感じるゆえんです。Cognitive Servicesは他の筆者記事で展開することはあれど自分で書くことはあまりないかなと思います。

ということから、AIカテゴリでの申請もちょっと難しいかと、今のところ考えています。

わたしが一番使っているライブラリはTensorFlow(Keras)なので、同様の受賞を目指すならGoogle Developers Expertsになるのかなと思っていますが、目指すのはまだまだ先の話ですね。

『機械学習 & ディープラーニング入門』連載群の後

『機械学習 & ディープラーニング入門』連載群の後には、実はまた変化が予定されているのですがそれはまだ秘密として、例えば機械学習エンジニアやデータサイエンティストにすでになっている人が読んで楽しめる単発記事などが増える予定です。なので「単発記事を書いてもいいよ」という人をできるだけ多く、今春は探していきます。わたし自身も新しいものを書いていきたいと思います。

DEEP LEARNING LAB: AI開発を円滑に進めるための契約・法務・知財 聴講ノート

※これはセミナー聴講時の個人的なノートをそのまま公開したものです。誤字誤植や勘違いがある可能性があるのでご了承ください。

DEEP LEARNING LAB: AI開発を円滑に進めるための契約・法務・知財 - connpass

第3 AIの生成に関する法律問題

  • AIで問題となるのは「提供:第三者提供の場合には原則として本人の同意が必要」

    1. . 書面なりで第三者提供の最初から取っておくのが望ましい
    2. . 誰のモノか分からない状態(=復元できない状態)にしてしまうと規制がかからない
    3. . 以降は細かいので省略
  • 質問への回答: 著作権は著作物に対するモノ。センサーカメラの画像データは著作物ではない

  • 質問への回答: クラウドに預けているデータは貸金庫のようなもので提供しているわけではないと考える
  • 質問への回答: 個人情報保護は民間用。国や大学は違う法規制になっている

第2 AIの生成に関する法律問題

  • 著作権法上の複製と翻案をしてデータを作っている
  • 複製権、上映権、公衆送信権などの権利をまとめて「著作権」と呼んでいる
  • 著作権には一定の例外(=「権利制限規定」)をもうけている: 例えば私的複製や引用は無断にしてよい
  • その例外の1つが「著作権法30条の四」:

    • できたて1月1日から施行されている。著作権を持つ生データから営利的に学習用データセットや学習済みモデルを生成できる
    • サーバーの所在地が重要。作業を日本でしていれば、どこの国のデータを使ってもよい
    • 世界でも珍しい法律。日本はパラダイス。機械学習したかったら、日本に来た方がいい
    • 手塚治虫の漫画をデジタル化してそのまま読めてしまう状態で売れば、それは当然、この法令の適用とはならない
  • 質問への回答: ネットに転がっている画像をデータセットに使える。例えばテレビCMでも同様に利用できる

  • 質問への回答: Webサイトの管理人が「無断で使うな」と書かれている場合は、確かに適用外になる? 利用規約で制限されているなら

1 性能保証・検収・瑕疵(かし)担保

  • 1と2が大切:「1. AIと通常の開発は違うと理解してもらう」「2. 開発プロセスや契約を分割する」「3. 契約内容の工夫」
  • AIと通常の開発は違うと理解してもらう
  • 開発プロセスや契約を分割する
    • AIはやってみないと分からない。アセスメント、PoCをまずはやる。次に開発、追加学習。この4プロセスに分けてしまうなど
  • 契約内容の工夫
    • AIの場合はどこまで作れるか分からないので、準委任契約にするのが通常
    • PoC貧乏: PoCで止まって、次の開発に行ってくれなくて儲からない。というのを避けるために、移行義務を契約に盛り込むなどの対策を
    • PoCの横展開を防ぐために、レポートのみにしてソースコードは渡さない

2 権利と知財

  • AIの場合、材料や中間成果物、成果物などができ、それが価値を持つ
  • ユーザーとベンダーの権利と知財は問題になりやすい
  • 例えばセンサーデータは著作物ではない。契約がなければ法律に従うことになる
  • 一定の条件(営業秘密、限定提供データ)に該当すれば不正競争防止法
    • 具体的には、有用性、非公知性、秘密管理性という要件を満たすこと。普通のセンサーデータは満たさない
    • 契約に「本開発においてのみ使います」と書かれていれば、データはそれにしか使えない
  • 「学習済みモデル」の意味が違う場合があるので最初に意味を特定する必要がある
  • パラメーターは知的財産権の対象ではないので、契約に条項を入れる必要がある
  • ユーザーとベンダーの権利と知財: どっちが権利を持っているかではなく、どう使えるか。利用条件で「実」を取る
  • 「共有」すると後々も問題になる
  • ビジネス上の検討⇒契約条件の検討という順になる
  • 検証段階で制限なくデータを渡すのはやめた方がいい
  • 「権利帰属」と「利用条件」は分けて考えた方がいい
  • 契約の限界を知っておく

3 責任

  • AIと通常のシステム開発は違う
  • 責任の種類を知り、契約でコントロールする

質疑応答

  • 質問: ディープラーニングだけの話ではないか?

    • 回答: AIに明確な定義があるわけではない。今回の話はディープラーニングなどの機械学習に関連した話だった。
  • 質問: ガイドラインの次バージョンは?

    • 回答: 医療といった特定範囲を盛り込むなどのマイナーチェンジになるのではないかと思う。バージョンアップし続ける予定。6月ぐらいに成果物が出てくると思う。
  • 質問: ユーザーが生データを渡した場合に、ベンダーが生成したパラメーターも秘密情報となるか。

    • 回答: データについては秘密保持義務を結んでいるはず。パラメーターはベンダーが生成したものなので、ユーザーの秘密情報というのは難しい。
  • 質問: 業者が何らかの対象の写真を撮った場合に権限はどうなるか?

    • 回答: 画像データには著作権はなく写真は撮った人のものなので、自由に使ってよい。
  • 質問: 写真にアノテーションを付与したのであれば、そのデータに著作権は発生するのか? 専門家が付けたのであれば?

    • 回答: 契約による。法律上、アノテーションはラベルを付けているだけなので権利が発生するわけではない。いくら専門的なアノテーションであっても、もともとあるものを発見したものは創作ではないので、著作物ではない。
  • 質問: 日本の法律内で作った学習モデルをアメリカに持っていった場合、みなし侵害になったりしないか?

    • 回答: 確かにアメリカの法律が適法になる可能性はある。しかし通常、みなし侵害は、海賊版のようなものに適用しており、そうならならいのではないかという意見もある。学習済みモデルは、生データは残っていないので、問題ないのではないかとは思うが。

PyData.tokyo One-day Conference 2018 聴講ノート

※これはセミナー聴講時の個人的なノートをそのまま公開したものです。誤字誤植や勘違いがある可能性があるのでご了承ください。

PyData.tokyo One-day Conference 2018 - connpass

Session1 データ分析のための Python パフォーマンスチューニングテクニック

NumPyを中心としたエコシステム

  • Pythonの標準ライブラリとして開発
  • 最初から公式と認識され、コミュニティが成長

NumPy言語仕様の発展の歴史

  • L[i , j, k]のような書き方はPyhton 1.4から。NumPy用に提案された
  • L[1:2, ..., 2:3]...(ellipsis)も同じバージョンから。NumPy用
  • matmul(A, B) -> A @ Bという書き方もPython 3.5から
  • C言語を使った拡張も作りやすい

Pythonの並列化

  • マルチスレッド、マルチプロセス、で速くなると期待し過ぎない方がいい
  • 計算量の削減やデータ量の削減が速度向上の基本
  • データ処理であればマルチスレッドが楽。マルチプロセスは複雑なので
  • GIL(Global Interpreter Lock):Pythonインタプリタは複数のスレッドで同時に実行できない。実行権をもつのは1つだけという仕組み。つまりマルチスレッドにしても性能は向上しない
  • GILが必要なところ(Pythonの部分)とそうでないところ(コンソール出力するところなど)がある

NumPyの並列化

  • NumPyはGILを解放するため、マルチスレッド化は有効になっている
  • numpy.add()をマルチスレッド化しても効果なし。行列サイズを1000*1000ぐらい巨大化するとようやく少し効果が出てくる
  • 速度はスレッド数に比例しない、という結論
  • CPUが速くても、メモリの性能が限界に達する

GPUを用いた並列化

  • CPUからGPUへはストリームを通じて演算を依頼する(CUDA)。この際、GPUでの演算は非同期に実行される
  • 複数のストリームで通信して並列実行できる
  • マルチGPUの場合、それぞれのGPUが独立してストリームを持っているので、多重化した通信を簡単に書ける。マルチGPUではスレッドが利く

Session2 PythonによるWikipediaを活用した自然言語処理

Wikipediaを自然言語処理に使う

  1. Wikipediaをテキストコーパスに使う
  2. Wikipediaから表記ゆれしやすい文字ペアを抽出する
  3. Wikipediaエンティティ辞書を活用する
  4. 単語のエンティティとベクトル表現を学習する

1. Wikipediaをテキストコーパスに使う

  • DBpedia NIF データセット
    • Wikiマークアップの除去は難しいが、そんなことしなくてもテキストが取れる
  • そのデータセットからコーパスを作成

2. Wikipediaから表記ゆれしやすい文字ペアを抽出する

  • Wikipediaリダイレクト:Wikipediaエンティティにアクセスした際に表記ゆれを抽出できる機能
  • Wikipedia2Vec

3. Wikipediaエンティティ辞書を活用する

  • 「アップル」というエンティティに対して、企業か、リンゴか、にマップする辞書
  • エンティティ辞書に有用な2つの指標:リンク確率(リンクとしての出現率)とコモンネス(特定のエンティティを指し示す確率。曖昧性を示す)

4. 単語のエンティティとベクトル表現を学習する

  • Wikipedia2Vec: word2vec(skip-gram)を拡張したモデルを採用
    • KG graph modelとAnchor context modelの2つのコンテキストをskip-gramに追加

Wikipedia2Vec

  • オープンソース化している。Pythonベースで実装し、実装の大半をCythonを用いてCに変換
  • gensimやfastTextと同等以上の性能を達成

ウォーキングの歩数をバーチャル名所で競う「歩数イベント」

ウォーキングをしている人にとっては、張り合いや目標みたいなものって欲しくなりますよね?

自分もウォーキングは雨の降らない日は毎日していますが、できるだけ知らない町や道を歩いてみたり楽しめるよう工夫しています。

そんなときに、体重計のタニタのサイトを通じてたまたま知ったのが、タイトルになっている「からだカルテ:歩数イベント」です。2018年から全部参加していて、今ちょうど3回目になります。

f:id:misshiki:20181013145420p:plain

こんな感じで、からだカルテのサイトで[歩いた距離]や[ゴールまでの達成率]、[順位]、[現在地]、[平均歩数(週、月)]が見られます。

だいたい毎日8000歩以上歩かないとゴールできない感じになっていると思います。僕の経験では5kmで約7000歩です。雨が降ったり予定があったりするので、歩ける日は10kmウォーキングするぐらいのペースだと、(僕の経験では)30日間の期間内にゴールできます。ゴールすると、プレゼントが当たるらしいです(※イベント開催ごとに内容や条件が違います)。

f:id:misshiki:20181013151033p:plain

ランキングは上位200位まで見られます。ちなみに1位は11日間ですでにゴールを2週していました。30日間だと4~5週になると思います。普通の人は無理ですね。

f:id:misshiki:20181013151255p:plain

「歩数イベント」の特徴は、日本や世界の名所をバーチャルで回れるということ。今歩いたのが、この町のこのあたりかというのが分かって、その都市を歩いているみたいで楽しいし、中間目標を作りやすいので続けやすいです。

f:id:misshiki:20181013151453p:plain

あと、2018年10月は「幕末江戸編」というのをやっていて、江戸末期の街をウォーキングできます。Webサイト経由ですが古地図にマッピングして「どこを歩ているか」が見られるし、実際に古地図通りに歩くこともできます。ただ、僕はほとんど使ってないです……。

f:id:misshiki:20181013151657p:plain

残念なのは、「歩数イベント」はずっと開催しているわけではないことです。1年に3回ぐらい開催されていて、直近は以下のようなイベントがありました。

  • 2018/10/01-10/31: 歴史探訪シリーズ 幕末江戸編
  • 2018/07/05-08/23: 徳島編
  • 2018/02/13/-03/19: 歴史探訪シリーズ 幕末江戸編

過去には、徳島 編、富士山 編、エジプト 編、京都 編、フランス 編、三島市 編、沖縄 編、弱虫ペダル 編、北海道 編、劇場版 TIGER & BUNNY -The Rising- 編、進撃の巨人編、イギリス 編、エヴァンゲリオン 編、イギリス 編、韓国 編、ハワイ 編、エジプト 編、ドイツ 編、トルコ 編、南アフリカ 編、東南アジア 編、ニューイヤーウォーク 編、イタリア中部 編、番外編  「剱岳 点の記」、ハワイ 編、マチュピチュ 編、グランドサークル 編というのがあったみたいです。

正直、毎月やってほしいのですが、残念です。

あと、大きなデメリットが、からだカルテ会員(有料)か、会員でなければ参加費500円(税込、2カ月間の一時会員)がかかります。自分は参加費500円払っていますが、まぁ運営費などもかかるとはいえ、残念です。イベントを毎月やって、スマホアプリから毎月300円徴収ぐらいなら我慢できるかなと思います。年払い3000円とかがあればなおよし。

という、メリットもデメリットもあるのですが、興味を持たれたならばぜひ試してみてください。

参加するには、活動量計(タニタのAM-150、AM-161)が必要で、なくてもHealth Planet Walkというスマホアプリだけでもできます。

タニタのAM-150、AM-161はこちらからお願いします: タニタ

スマホアプリ(探すのはストアアプリからお願いします): f:id:misshiki:20181013152812p:plain

あとは「からだカルテ:歩数イベント」などから情報収集してみてください。

ともにウォーキングを頑張りましょう。

GTC Japan 2018 聴講ノート

※これはセミナー聴講時の個人的なノートをそのまま公開したものです。誤字誤植や勘違いがある可能性があるのでご了承ください。

Day 1: GTC Japan 2018: 9/13-14 グランドプリンスホテル新高輪


基調講演[JENSEN HUANG  NVIDIA 創業者、社長兼 CEO]

NVIDIA GDX-2

世界をリードするAIプラットフォーム

  • 例:1週間かかったResNet-50モデルの学習が、TensorコアGPUでは数分で完了した
  • 日本のリーダー企業との協業例: TSUBAMEはNVIDIA Teslaを使った世界初のスパコン

Tesla 14を発表

  • 高速な推論アーキテクチャを持つ
  • 1クロックで4x4行列の積和演算を行うTensorコアを320個搭載

Tesla T4を発表

  • Pascalに比べて12倍の性能を向上させた
  • そのすべてが消費電力75Wで実現される
  • TensorRTの発表以来(1年間)、12000以上の開発者がダウンロード

NVIDA TensorRTハイパースケール推論プラットフォームを発表

  • 多精度Tensorコアを持つTesla T4やTensorRT 5、それにTensorRTハイパースケールから成る、新しい推論プラットフォーム
  • 次世代のAIサービスを更新していく

XAVIER

  • 初の自律動作マシンプロセッサ
  • わずか30Wで毎秒100兆以上のオペレーションを行う

NVIDIA AGXを発表

  • ロボットなどで使えるコンピューター基盤
  • XAVIERが搭載されている

NVIDIA DRIVE


人工知能をビジネスに実装するとき、今やるべきこと[松尾 豊 東京大学 特任准教授、日本ディープラーニング協会理事長]

  • https://www.nvidia.com/ja-jp/gtc/sessions?sid=2018-1010
  • 画像認識は人間を超える結果が多く出ている
  • 翻訳精度も上がっており、マイクロソフトが中国語⇒英語翻訳は人間並みと発表している
  • ディープラーニングを一番理解してもらえる可能性が高いのが、「最小二乗法」を学んで中身を知ってもらうこと
    • 線を引く=最小二乗法( Y' = a + bx, J=Σ(y - y')2 )こと
    • ここから変数を増やしていく( Y' = a + bx_1 +cx_2 ... )
    • 誤差を最小にするようにパラメーターを求めてやる
    • ディープラーニングは、この最小二乗法のお化けのようなもの
    • これの層を深くしていったもの
  • なぜ深いことが重要か
    • 1層(素材が1つ)だと、できる料理は少ない
    • 層を増やすと、飛躍的にできる料理は増えていく
  • xとyに何を置くかでいろんなことができる
    • x:画像, y:クラス, =画像認識
  • 要するに「ディープラーニング=深い関数を使った最小二乗法」
  • 現状の原理は簡単だが、今後、組み合わされたり発展したりして、さまざまな活用が行われていく
  • わずか6~7年にディープラーニングは急速に発展してきた
  • これから先も発展があるはず。特に世界モデル(世界を3次元として認識する)は進展の可能性が高い
    • World Models(シュミットさん、2018年)
    • GQN(Generative Query Network)(アリさんら、2018年)。特に重要な論文
  • AI研究の歴史は「シンボル派とパターン派の戦い」だった。
    • ディープラーニングは記号(シンボル)の世界
    • 今後、パターンの世界でも革新が起きていくはず。人間の場合、記号がパターンを呼び出すから
  • 2020年までは、単なる画像認識もまだまだ発展していく
  • 2017年~2025年は、目を持つ機械が誕生する
  • ディープラーニングのプロジェクトがどう進むか
    • 警備会社が「イベント会場内で不審者を見つけるシステムを作りたい」という問題例
      • 不審者の定義が必要。そこから議論
        • 顔認証? 行動認識? 異常検知?
      • 製品化のための具体的な内容の議論が始まる
        • データを集める。映像データとアノテーション、公開されているデータも積極的に活用
        • アルゴリズムを構築する。精度がどのくらい出るかを見る
      • 試行錯誤
      • 製品化
    • 最初は社長「AIで何か作れ」と適当な指示で始まる
      • 半年くらいでこなれてきて、分かってくるので、楽しくなる
      • 社長も見て喜び、プレスリリースを出す
      • AIチームが強化されていく
      • 最終的にAI専門の子会社が立ち上がる
    • というのが、ディープラーニングを取り組む企業のよくあるパターン
  • ディープラーニングは、インターネットでいうと1998年。20年ぐらいずれている印象
    • 次の20年で、FacebookやAmazonのような大企業がディープラーニング分野で登場する
    • 2038年がどうなっているか、を想像して、われわれは動く必要がある
  • ディープラーニング時代のプラットフォーマーとは?
    1. 熟練の目のスコア化
    2. 中心的な作業の自動化
    3. 現場作業への横展開
    4. サプライチェーンの再編
    5. 個人の消費活動にまで及ぶ(ここが一番利益率が高い)
  • ディープラーニングの人材が不足している
    • 松尾研の講座や卒業者のスタートアップの紹介
    • JDLA(資格試験)の紹介
    • Courceraのディープラーニング講座が分かりやすくてお勧め
    • 人材では「高専生」の可能性が実は一番大きいのではないか
      • なぜなら、ディープラーニングはハードウェア系と結び付きが強いから
      • IT系の人はハードウェアの知識がないので、ハードウェアを教育するのに時間がかかるため
  • ディープラーニング×ものづくり=日本向きなので、日本の新たな産業競争力になる
    • ぜひ日本で事業を興してほしい

CuPy -NumPy 互換 GPU ライブラリによる Python での高速計算-[奥田 遼介 Preferred Networks 取締役 最高技術責任者]

CuPyとは?

  • GPUを使ったNumPy互換のライブラリ
  • NumPyのコードは、import numpyからimport cupyに書き換えるだけで基本的に動く

なぜCuPyを作ったか?

  • NumPyは裏でいろいろやっていて闇のトリックがある
  • ゆえに、互換性があるライブラリを作るのは大変だった
  • Chainerとともに生まれたが、別ライブラリとして分離した

CuPy v2以降の取り組み

  • NumPyとの差分の改善
  • 速度向上: Cytahon化、メモリプールの改善など
  • CUDA Streamサポート
  • 対応関数の充実: Numpy, Sparase Matic, FFG, scipy ndimage対応など

CuPyの目指す方向

  • 最小限の修正でPythonコードをGPU対応に
    • CPU向けライブラリと高い互換性の確保
    • NumPyだけでなく、SciPyなどにも対応している
  • 気軽にGPUで高速化
    • インストールの簡易化
    • デフォルトで性能が出る設計

コード例(CPU<-->GPUも簡単):

import numpy as np
import cupy as cp
cpu_val = cp.asarray(gpu_val)    # GPU -> CPU
gpu_val = np.asnumpy(cpu_val) # CPU -> GPU

パフォーマンス

  • NumPyと比較して、データが多くなってくるとCuPyの数十倍~百倍ほど速い
  • @cupy.fuse()を使うともっと速くなる

応用レベルの機能

  • GPUメモリが足りない場合、Unified Memoryを利用して回避できる: CuPy+Tesla V100など(※対応するGPUがある)
  • どうしてもCUDAを直接書きたい場合は、ユーザー定義カーネル(cp.RawKernel())を使えばよい
  • どうしてもCUDAは書きたくない場合、Numba(from numba import cuda)と連携して回避できる

CuPyのこれから

  • 2018年10月にCuPy v5をリリース予定
    • 前述のFusionやNumbaサポート
    • Windows対応

最新の論文や独自手法を活用したディープラーニングソリューションの事例[柳原 尚史 Ridge-i CEO、木村 正成 Ridge-i エンジニア]

従来システム開発とAI開発の比較

  • ルールベースか、質がデータに依存するか
  • 厳密解か、近似解か
  • 演繹的でホワイトボックスか、機能的でブラックボックスか
  • 両方に得意なところがあるので、ベストミックスを目指すとよい

AI開発アセスメントからAI開発・導入までの流れ

  • AI導入の目的を明確にするのが重要
  • お客さんと一緒に、アセスメント~導入をいったりきたりする必要もある

Ridge-i の取り組み

  • ベストミックスを実現したソリューション

Ridge-i の事例

  • ディープラーニングによる自動彩色: 求める色合いを正確に再現する彩色ディープラーニング(服などをビビッドな色に)
  • ごみ焼却炉でのセグメンテーション活用: ゴミ質によって安定した燃焼ができないが、ディープラーニングによりモノを識別してゴミの質を安定化させることに成功
  • 衛星レーダー画像(SAR)でオイル流出検出: 衛星画像に対するディープラーニングによる解析の普及活動に参画。オイル漏れは教師データが少ないため、画像を増やすテクノロジを多用してデータを用意した
  • ルールにできなかった異常検知: 良品には存在しなかった傷やゆがみを検出。良品画像の特徴のみを学習させた。これにより極小の傷を検知できるようになった
    • さまざまな課題があった:
      • 良品の定義が難しい
      • 画像を高解像度に維持してGANモデルを作成する必要性があり、通常のGANだと収束しない
      • PCサーバーだと学習に数週間かかってしまう。高解像度データがメモリに乗らない
    • さまざまな工夫をして解決した

異常検知の難しさ

  • 画像を細かく切るパッチ処理だと、傷なのか模様なのか判別できないので、切らずに高解像度の画像を使う必要があった
  • 最新の敵対生成学習の手法(Progressive Growing of GANs)によって、高解像度かつ高精細な画像を生成できるようになった

敵対生成学習

  • GAN(Generative Adversarial Networks)で正常画像を生成できるようにする
  • それと入力データの差分を取ることで、異常が検知できる

データ拡張

  • 画像データの水増し: ノイズを減らせるが、それ以上の影響が出ないかの注意も必要

パネル: ディープラーニング ビジネス活用の理想と現実[井﨑 武士 エヌビディア合同会社 エンタープライズ事業部 事業部長]

  • https://www.nvidia.com/ja-jp/gtc/sessions?sid=2018-1017

  • 米中に比べると日本は後進国と呼ばれている

  • 国策としてデータの利活用など促進させようとしているが、人材育成や企業連携が十分ではない
  • ディープラーニングは2025年までに54%成長を続けるというグラフもある
  • パネリスト:
    • 東京大学の松尾先生
    • 武蔵精密工業の大塚氏
    • IGPIビジネスアナリティクス&インテリジェンスの川上氏
    • コマツの岩本氏
    • DeepXの那須野氏
    • 以下継承略。

データの利活用

  • 「データはある」という会社は多いが、実際には使えるデータと使えないデータがある。そのポイントは?
  • 川上: 自社に何のデータがあるかよく分かっていない。最後はSIが出てくるが、開いて見ると「使いにくいデータですね」という話になる。
  • 岩本: データというのはいっぱいある。デジタルデータで見ると数字の山。そこからピックアップして初めて情報になる。そこにもノイズがあったりする。次に情報の意味づけ(=タグ付け)が必要になる。ここまでデータを作る工数は大変なもの。ここは人海戦術しかなく、実際に全体の半分がここに費やされている。
  • 松尾: データのタグ付けにコストがかかるので、それをどうやってやるかが企業の競争力になる。中国などは、そこに専門部隊を用意していたりするので競争力がある。
  • 大塚: 大量に同じモノを作るので、大量のデータがすでにある。だからといってそれを使ってディープラーニングという話には違和感がある。そうではなく課題を明確にする必要がある。目を作るという課題を掲げれば、それに必要なデータを用意できる。そう考えないとうまくいかないと感じている。
  • 松尾: 不良品データを集めるのは難しいですよね?
  • 大塚: それが本当に大変。不良品は出ない。だから不良品の画像を自作する。もしくは良品データだけを学習させて異常検知することをしている。
  • 利益を生み出すシナリオ作りはどうしたらよいか?
  • 松尾: シナリオについては、技術が分かればどれを使えばよいか分かる。どこまでやるかは経営判断。だからそんなに難しい話ではない。

人材

  • 経産省が発表した先端IT人材は2020年までに4.8万人不足すると言っている
  • JDLAでは3万人のエンジニアを育成することを目標としている
  • 企業ではどんな人材が求められているのか
  • 松尾: 米中はどんどんやっているという話はあったけど、お金になるチャンスの話は米中は意識が研ぎ澄まされていると感じている。だから米中が先行している。日本はこの20年で内向きになってしまった。インターネット時代は、HTMLをやって、サーバーをやって、プログラミング言語をやりましょうよ、とやった。ディープラーニング協会でやろうとしてるのはそれと同じで、必要な技術はちゃんと学びましょうよ、ということ。知識を付けてやってみるのが最初のステップ。
  • 起業についてのアドバイスは?
  • 那須野: わたしが起業したのは「気質」という理由があるかもしれない。Web開発でザッカーバーグになるというのが学部3年ごろの時代の雰囲気だった。たまたま松尾研でAIを学んで、Amazonのレコメンドなどデータサイエンスが脚光を浴びる時代だった。ディープラーニングで機械を自動化していくというのは魅力を感じている。周りも起業していったので、自分も起業しようと思った。
  • ディープラーニングを勉強するのはどれくらい難しいのか?
  • 松尾: やればできるはず。情報がWebにたくさんある。昔のHTML登場時に学ぶ時の方が難しかった。プログラミングができれば、1時間もあれば何かしらできる。
  • 人材育成にどう取り組まれているか?
  • 岩本: なかなかディープラーニングに興味を持ってもらえない。新人と年配の人の両方でやっていくしかない。年配の人は新しい技術が来ても使わない人と、何でもかんでもそれで実現できると思う人と、両極端になってしまっている。ディープラーニングはそういう状況。
  • 大塚: 社内募集した。Pythonを知っている人など、技術好きの人が応募してきた。そういう若い技術好きが会社には必ず居るはず。好きこそものの上手なれだと感じている。おじさんたちは理解できないので、ほっておけば勉強してきてくれる。
  • 松尾: 社内で手を上げさせるのは賛成。あとは任せておけば、自分たちでコミュニティを作ってやっていく。

企業連携

  • 従来のIT業界は受託開発中心だった。しかしディープラーニング時代は協業など対等な関係で連携しているのが多い。
  • 契約やPoCの課題点は?
  • 川上: 自由度を持ってしっかり開発できるかが、企業連携を成功させるには重要。対等な関係で協業すべきだが、やはり受託的になっていくことも多い。
  • 那須野: AIスタートアップという立場で大手メーカーと連携している。人工知能の成果物は汎用的なので知財をもっていかれると問題。だから法務をしっかりとするのが大切。
  • 那須野: ディープラーニングは開発方法が、ITとは違う。最初に完全な設計はできない。アジャイル型になる。すべてを文書化することも、開発時間に影響するのでできない。
  • 川上: スタートアップと80年の伝統企業は違う。服装から年齢からいろいろ違う。ディープラーニングはある程度の精度でスピードは圧倒的に速いので、スタートアップ向け。お互いに歩み寄りが必要。

TIPS: Visual Studio Codeでファイルを開くとタブが上書きされて、ファイルを2つ開けない場合の対処方法

Visual Studio Codeでファイルは、シングルクリックだとプレビューモードで、ダブルクリックだと編集モードで開くらしいです。

プレビューモードだとタブが上書きされてしまうようです。

たぶん件名の問題が起きている場合は、シングルクリックでタブを開いていると思います。 ダブルクリックで開いて見てください。

参考:ユーザーインターフェイス | 非公式 - Visual Studio Code Docs

matplotlibのグラフで日本語を使う手法まとめ

問題と、この記事の目的

matplotlibのグラフを描画するときにタイトルや凡例などに日本語を使うと、次のように通常は文字化けしてしまいます(豆腐□になる)。

f:id:misshiki:20180815145120p:plain

これを回避して次のように日本語で表示する方法を、自分用の備忘録として、また他の人の参考用に、まとめておきます。

f:id:misshiki:20180815145249p:plain

フォントを指定する方法には、主に次の3段階があります。

  • 1.【個別のフォント】を設定
  • 2. 【以下すべてのmatplotlibのフォント】をまとめて設定
  • 3.【matplotlib全体のデフォルトフォント】を設定

それぞれ説明していきます。

フォントのダウンロード

その前に必要に応じて使うフォントを、OSにインストールしておいてください。この記事では以下を使います。

1. 【個別のフォント】を設定

1の手法の利点は、必要なところだけフォントを設定できるので、より細かくカスタマイズできるところです。実行するコードは、次のようになります。なお、axaxes(figure図の中にあるグラフ本体)のことです。

# 1. 【個別のフォント】を設定できる
font = {'family': 'IPAexGothic',
        'size': 14}
ax.set_title('日本語タイトル', fontdict=font)
ax.set_xlabel('X軸', fontdict=font)
ax.set_ylabel('Y軸', fontdict=font)

ただ、この方法だと、凡例(legend)が設定できないらしい。凡例を日本語化するには、以下のようにFontPropertiesを使う必要があります。

from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=r'C:\WINDOWS\Fonts\SourceHanCodeJP-Regular.otf', size=14) # 他にはipaexg.ttfフォント
ax.set_title('日本語タイトル', fontproperties=fp)
ax.legend(['凡例だけはprop=fp', 'それ以外はfontproperties=fp'], loc='upper left', prop=fp)

FontPropertiesを使うデメリットは、フォントファイルを直接扱っているので環境依存が強まる点だと思います。

2. 【以下すべてのmatplotlibのフォント】をまとめて設定

次がmatplotlibのrc(“run commands”: いわゆる実行・挙動の構成)をダイナミックに設定する方法です。あくまでダイナミックなので、その実行において一時的に適用されます。

# 2.【以下すべてのmatplotlibのフォント】をまとめて設定できる
import matplotlib
font = {'family' : 'SourceHanCodeJP-Regular',
        'size'   : 14}
matplotlib.rc('font', **font)

以下のように設定することも可能です。

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'IPAexGothic'
plt.rcParams['font.size'] = 14

1のようにすべてにフォントを設定しなくてよいので便利です。また、実行のたびにフォントを変えられるので、手法の中では一番オススメです。

3. 【matplotlib全体のデフォルトフォント】を設定

上記のように、個別に設定したり、実行ごとに設定設定すたりするのが面倒な場合は、matplotlib全体の構成を担うrcファイルで、デフォルトのフォントを設定してしまうとよいです。

これにはまず以下を実行して、matplotlibrcの場所を取得します。

# 3. 【matplotlib全体のデフォルトフォント】を設定できる
import matplotlib
# 設定ファイルの場所を取得
print(matplotlib.matplotlib_fname())
# 取得例: 'C:\Users\masa-i\Miniconda3\envs\introtensorflow\lib\site-packages\matplotlib\mpl-data\matplotlibrc'

次に、このファイルをエディターで開き、[font.family]の値を編集して保存してください。

f:id:misshiki:20180815155222p:plain

フォントはキャッシュされているらしいので、次のコードを実行して、いったん再構築しておきます。

# フォントキャッシュを再構築
matplotlib.font_manager._rebuild()

さらに、Jupyter Notebookを使っている場合は、いったんカーネルを再起動してください。これをしないと、正常にmatplotlibrcファイルの設定が反映しないようでした。

よく日本語を使う場合は、matplotlibrcファイルでデフォルトフォントを設定しておくと便利だと思います。

まとめ

以上、matplotlibの日本語設定方法をまとめました。

ネット上でたくさんヒットするのですが、情報が分散していて調べるのに苦労しました。今後もよく使う内容だと思うので、調べた内容をここにまとめ直しました。

Hope this helps.