tag:crieit.net,2005:https://crieit.net/tags/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0/feed 「ディープラーニング」の記事 - Crieit Crieitでタグ「ディープラーニング」に投稿された最近の記事 2019-12-10T22:42:27+09:00 https://crieit.net/tags/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0/feed tag:crieit.net,2005:PublicArticle/15595 2019-12-10T22:37:42+09:00 2019-12-10T22:42:27+09:00 https://crieit.net/posts/AI-5def9fa6b3a97 AI時代はアナログ人材を不要にするか問題 <h1 id="はじめに AIの未来とアナログ人材"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB%E3%80%80AI%E3%81%AE%E6%9C%AA%E6%9D%A5%E3%81%A8%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E4%BA%BA%E6%9D%90">はじめに AIの未来とアナログ人材</a></h1> <p>普段、平日はRを使いごりごりと。最近、Pythonも勉強し始めました。(遅)</p> <p>東大の松尾教授の研究室で公開されている<a target="_blank" rel="nofollow noopener" href="https://weblab.t.u-tokyo.ac.jp/%E6%BC%94%E7%BF%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E5%85%AC%E9%96%8B%E3%83%9A%E3%83%BC%E3%82%B8/">演習コンテンツページ</a>とか見ると、ありがたいなぁと思いつつ…これを10代、20代前半でガシガシやってのける東大生ってやっぱすごいわと思うこの頃です。社会人でも応募できるDL4USとかも魅力的。</p> <p>学生のときは文系の研究室にいて組織論研究に身をささげてきたこともあって、<br /> データ分析を生業にしながら、「AIが人の仕事を奪う」とか「AI時代の人材教育」なんて聞くと色々考えてしまいます。</p> <p>かつて日本が製造業のものづくりで、トップにたっていたのは1980年代くらいまででしょうか。<br /> いまや海外から見た日本と言えば、テクノロジー分野の後発が多く、魅力的なイノベーションを生む土壌が弱いような。</p> <p>アナログのものづくりできらりと光ってた国内人材スピリットはどこへやら…<br /> デジタル、デジタルって言われて久しいけど、結局アナログ人材は要らんのか。</p> <p>そんなことないよなぁと思いつつ、徒然にAI時代の人材活用論について備忘録を残したいと思います。</p> <p><strong><a target="_blank" rel="nofollow noopener" href="https://ledge.ai/dl4us/">(引用:松尾研監修のディープラーニング無償講座(下図))</a></strong><br /> <a href="https://crieit.now.sh/upload_images/4d207ae728fddecac37bd59b5e3b37255def97ccd2ea1.JPG" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4d207ae728fddecac37bd59b5e3b37255def97ccd2ea1.JPG?mw=700" alt="Deeplearning.JPG" /></a></p> <h1 id="日本のAI実践活用 世界での立ち位置は"><a href="#%E6%97%A5%E6%9C%AC%E3%81%AEAI%E5%AE%9F%E8%B7%B5%E6%B4%BB%E7%94%A8%E3%80%80%E4%B8%96%E7%95%8C%E3%81%A7%E3%81%AE%E7%AB%8B%E3%81%A1%E4%BD%8D%E7%BD%AE%E3%81%AF">日本のAI実践活用 世界での立ち位置は</a></h1> <p>東京大学大学院教授兼<a target="_blank" rel="nofollow noopener" href="https://www.jdla.org/">日本ディープラーニング協会</a>理事長の松尾豊氏は今や日本でAi投資、ビジネスを企てるソフトバンクグループ取締役でもあります。</p> <p>近年、人工知能(AI)やディープラーニングのビジネス活用については聞かない日はないほどですが、企業における実践的な活用という点では日本は米国、中国と比較して大きく遅れをとっています。</p> <p>そんななかで積極的なディープラーニング(深層学習)のビジネス活用を推進するソフトバンクグループに学術的権威の松尾氏が加わるというニュースは、いよいよ日本におけるディープラーニング活用が本気になってきたという希望を感じずにはいられません。</p> <p>少し前になりますが2019年6月8日に開催された、Microsoft・Preferred Networks協同運営のディープラーニングコミュニティイベント「DEEP LEARNING LAB(DLLAB)」内での松尾氏の基調講演でも<strong>日本国内のAI導入 / ディープラーニング活用は世界的に見ても遅れをとっている</strong>ことが強調されました。</p> <p>その背景と今後の改善点として挙げられていた<strong>5つの観点</strong>は</p> <ol> <li>小さな成功体験をすること</li> <li>AIチーム編成の重要性</li> <li>AIトレーニングの必要性</li> <li>明確なAI戦略</li> <li>内部・外部のコミュニケーション(IR / GR[Government Relations] / 顧客育成 / 人材獲得 / 社内コミュニケーション)の重要性</li> </ol> <p>と明確に述べられており、まさしくと感じる観点ばかりです。</p> <h1 id="日本企業のディープラーニング活用 苦戦の背景は"><a href="#%E6%97%A5%E6%9C%AC%E4%BC%81%E6%A5%AD%E3%81%AE%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E6%B4%BB%E7%94%A8%E3%80%80%E8%8B%A6%E6%88%A6%E3%81%AE%E8%83%8C%E6%99%AF%E3%81%AF">日本企業のディープラーニング活用 苦戦の背景は</a></h1> <p>上記の5つの課題点に加えて、外資系IT勤務時代にから聞いたリアルな声を総合してみると日本企業の実態は以下のようなのではないかと思います。</p> <blockquote> <p>AIの導入効果を立証できない(小さな成功体験の不足)→投資を引き出せない・社内理解がない(内部コミュニケーション不足)→AIチーム編成/トレーニングは二の次 →目的設定のないまま「何か」からはじめようとする(AI戦略・外部コミュニケーション不足)→安価なトライアルから始める→検証段階で頓挫→AIの導入効果を立証できない…</p> </blockquote> <p>この無限ループから抜けたもの勝ちでビジネスが成功していくように思います。これを眺めていると、戦略的AI / ディープラーニング活用のために最初に打つべき手としては<br /> • 投資の確保と適切な投入<br /> • 実践経験豊富なAI人材の獲得</p> <p>がキーになりそうです。</p> <p>一点目は、各企業の経営層の手腕だったり、まさしくソフトバンク社「ソフトバンク・ビジョン・ファンド」のようなファンド事業会社の取り組みだったりが問われるところです。</p> <p>二点目のAI人材の獲得ですが、ここが国内企業の一番の課題と言えそうです。なぜなら優秀な人材獲得のためには、パフォーマンスを発揮するための環境、社内業務側との連携体制、顧客育成のためのブランディングなど戦略的かつ組織的な見直しを伴うためです。</p> <p>近年増えているAI人材に「日本企業」を選んでもらうためには多くの課題が残っています。国内の優秀な人材からすると活躍の場は米国、中国、欧州といったテクノロジー先進国にも広がっているためです。海外ではAI人材獲得の前に「育成」という観点からすでに企業各社の戦略が光っています。</p> <p>ここのところ特に、海外ではiSchoolが人気を集めていたり、「STEM教育」という言葉が注目されたりしているように、多くの学問でテクノロジー思考やデータ活用による論理的アプローチが重要視されており、AI時代に有用な人材を育てる気風があります。</p> <p><strong>対して、2020年からやっと小学校でプログラミング教育が始まる日本。</strong></p> <p>「AI=プログラミング」という短絡さもさることながら、数歩先を行く欧米、アジア諸国からAI時代の人材育成の根本を学ぶ必要さえ感じます。</p> <h1 id="「IoT / モジュール化」の時代に光るアナログ人材"><a href="#%E3%80%8CIoT+%2F+%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%8C%96%E3%80%8D%E3%81%AE%E6%99%82%E4%BB%A3%E3%81%AB%E5%85%89%E3%82%8B%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E4%BA%BA%E6%9D%90">「IoT / モジュール化」の時代に光るアナログ人材</a></h1> <p>STEM教育が注目される中で「アナログ人材」**もここへきてスポットライトを当てられるべき存在ではないかと思うのです。</p> <p>ここでいうアナログ人材とはものづくりをハード面でかなえるスペシャリティのこと。<br /> コーダーだってデータサイエンティストだってものづくりしてますから!!</p> <p>クラウド化が進んで市場は圧倒的にソフト面に偏るように見えても、IoT、ウェアラブル端末によるデータ取得が増える今後、どれだけ小型なハードウェアを作れるかというのは腕の見せ所です。</p> <p>しかし、近年のデジタル(ソフト)人材の需要の高まりによって<strong>市場では圧倒的にアナログ人材が不足している</strong>とか。</p> <p>結果、電子部品のハードウェア開発のトレンドも複数の機能をひとつにまとめる<strong>「モジュール化」</strong>が流行っています。</p> <p>例えば、データや通信機器、産業機器、医療機器などの中核としていわば「脳ミソ」の役割をするプロセッサー。<br /> これに電力供給をする<a target="_blank" rel="nofollow noopener" href="https://jp.rs-online.com/web/c/semiconductors/power-management-ics/buck-converters/">降圧コンバータ</a>であるDC-DCコンバーターの例をとってみると、アナログ人材の不足が背景で、DCDCコンバータ回路を構成する抵抗器・コンデンサーなどをまるっとひとつにして時短で実装できるというかたちが流行っているといいます。</p> <p>人材不足を受けて、より効率化の方向にものづくりのやり方自体がなびいてしまっているようにも思います。</p> <p>かつて日本の製造業、ものづくりを支えた職人はもっと強いこだわりを見せていたのではないかと考えを巡らせてしまいます。</p> <p><strong>作りたいもの、が第一にあり、それを叶えるための組織と戦略がついてくる。</strong></p> <p>これからのAI時代における日本の返り咲きは「プログラミングがあーだ、こーだ」言う前にこんなこだわりの見直しが必要なのかもしれないですね。</p> <p>まさにこれからが日本国内でのAI・ディープラーニングビジネスの正念場。<br /> 各社の投資、人材教育に向けた取り組みには、引き続き注目していきたいものです。</p> <p>参考: AI活用成功のための「打ち手」を探る</p> tech-teku tag:crieit.net,2005:PublicArticle/14683 2018-12-23T21:48:33+09:00 2018-12-24T23:01:50+09:00 https://crieit.net/posts/AI-AI AIメーカーを支える技術(AIメーカーの作り方) <p>この記事は<a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a> の22日目です。</p> <hr /> <p><a href="https://crieit.now.sh/upload_images/0863bc275300d608abeffe9eb299fa625c1f837b53f0f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0863bc275300d608abeffe9eb299fa625c1f837b53f0f.png?mw=700" alt="aimaker_system.png" /></a></p> <hr /> <p>こんにちは、2z(Twitter: <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01">@2zn01</a> )です。</p> <p>普段は会社員でWeb系の開発エンジニアとして働き、週末に趣味で個人開発をしています。</p> <p>今年の7月に話題のAIをweb上で誰でも気軽に作れる「AIメーカー」というサービスをリリースしました!</p> <p>■AIメーカー<br /> <a target="_blank" rel="nofollow noopener" href="https://aimaker.io/">https://aimaker.io/</a></p> <p>この記事では、この「AIメーカー」で使っている技術をまとめたいと思います。</p> <h2 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h2> <p>以下の3ステップで誰でも簡単にAIを作れます!</p> <ol> <li>AIに覚えさせたいタグを入力</li> <li>タグから自動で画像データを収集</li> <li>AIがデータから学習</li> </ol> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今話題のAIをweb上で誰でも気軽に作れる「AIメーカー」を開発しました!①AIに覚えさせたいタグを入力②タグから自動で画像データを収集③AIがデータから学習の3ステップで誰でも簡単にAIを作れます!動画では手相占いのAIに挑戦!みんなもAIを作って遊んでみてね!<a target="_blank" rel="nofollow noopener" href="https://t.co/66DFU7GRZ2">https://t.co/66DFU7GRZ2</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/ie1LmioyA1">pic.twitter.com/ie1LmioyA1</a></p>— 2z@AIメーカー (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1019741210217365504?ref_src=twsrc%5Etfw">2018年7月19日</a></blockquote> <hr /> <h2 id="画面イメージ"><a href="#%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8">画面イメージ</a></h2> <h3 id="学習データの登録画面"><a href="#%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%99%BB%E9%8C%B2%E7%94%BB%E9%9D%A2">学習データの登録画面</a></h3> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">学習データを各ラベル名から自動で収集する機能を実装!これはなんとAidemyの石川さん(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/ai_aidemy?ref_src=twsrc%5Etfw">@ai_aidemy</a>)よりアドバイス頂いたアイディアです!大感謝!!僕も最近始めたところですが、Aidemyは機械学習、ブロックチェーンなど最新の技術も勉強できておすすめです!<a target="_blank" rel="nofollow noopener" href="https://t.co/gORhd5P7Ls">https://t.co/gORhd5P7Ls</a><a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/AI%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#AIメーカー</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/2cNpjzjPAl">pic.twitter.com/2cNpjzjPAl</a></p>— 2z / AIメーカー開発 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1015879835753672705?ref_src=twsrc%5Etfw">2018年7月8日</a></blockquote> <h3 id="モデルの学習画面"><a href="#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AD%A6%E7%BF%92%E7%94%BB%E9%9D%A2">モデルの学習画面</a></h3> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">複数AIのモデル学習を並列で走らせる対応も無事完了!(処理の裏側では複数のGPUサーバが走っている)学習には時間がかかってしまうため、エポック数(訓練データを何回繰り返して学習させるか)は500に調整し、10分以内には終わるように。精度よく学習させたい人は応相談にしておこう<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/AI%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#AIメーカー</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/ukM3sg9rNG">pic.twitter.com/ukM3sg9rNG</a></p>— 2z / AIメーカー開発 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1015723522696536065?ref_src=twsrc%5Etfw">2018年7月7日</a></blockquote> <h3 id="モデルの学習履歴"><a href="#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AD%A6%E7%BF%92%E5%B1%A5%E6%AD%B4">モデルの学習履歴</a></h3> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">学習履歴を一覧表示して、グラフを切り替えれるようにしてみた。<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/AI%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#AIメーカー</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/wxcxZ3HXLE">pic.twitter.com/wxcxZ3HXLE</a></p>— 2z / AIメーカー開発 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1015809482100654081?ref_src=twsrc%5Etfw">2018年7月8日</a></blockquote> <h3 id="モデルの推論結果画面"><a href="#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E6%8E%A8%E8%AB%96%E7%B5%90%E6%9E%9C%E7%94%BB%E9%9D%A2">モデルの推論結果画面</a></h3> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AIメーカーの診断結果へ無駄にグラフを追加してみた!<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/AI%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#AIメーカー</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/YCTaBDawhh">pic.twitter.com/YCTaBDawhh</a></p>— 2z / AIメーカー開発 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1018035942794260480?ref_src=twsrc%5Etfw">2018年7月14日</a></blockquote> <h2 id="システム構成図"><a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E6%88%90%E5%9B%B3">システム構成図</a></h2> <p>AIメーカーのシステム構成図は以下の通りです。</p> <p><a href="https://crieit.now.sh/upload_images/0863bc275300d608abeffe9eb299fa625c1f837b53f0f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0863bc275300d608abeffe9eb299fa625c1f837b53f0f.png?mw=700" alt="aimaker_system.png" /></a></p> <p>大きな構成としては、主にユーザからの様々なリクエストを受け付けるフロントサーバと機械学習の処理を取り扱うバックエンドサーバの2つがあります。</p> <h2 id="使用している技術"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93">使用している技術</a></h2> <h3 id="Linux"><a href="#Linux">Linux</a></h3> <p>クラウドのホスティングは、Amazon Web Services(以下、AWS)をメインで使用しており、Amazon EC2でサーバを立てています。<br /> サーバのOSはLinuxでAmazon Linux 2を使っています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/ec2/">Amazon EC2</a></li> </ul> <p>AWSがメインですが、文字起こし機能の方ではGoogle Cloud Platformで、Google Compute Engine(GCE)でサーバを立てています。<br /> サーバのOSはLinuxでCentOSの7系を使っています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/compute/?hl=ja">Google Compute Engine</a></li> </ul> <p>なぜAWSの他にGCPも使っているかというと、文字起こし機能の方でGoogle Cloud Vision APIやGoogle Cloud Speech APIを使っており、大容量の音声ファイルや画像ファイルを取扱うのにGoogle Cloud Storage経由で使った方が都合がいいからというのが理由になります。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/vision/?hl=ja">Google Cloud Vision API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/speech-to-text/?hl=ja">Google Cloud Speech API</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/storage/?hl=ja">Google Cloud Storage</a></li> </ul> <h3 id="Apache"><a href="#Apache">Apache</a></h3> <p>webサーバはApacheを使っています。<br /> Nginxもありますが、Apacheは普段から使っており、設定も把握していたため、いつも通りの安定の選択としました。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://httpd.apache.org/">Apache</a></li> </ul> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <p>Amazon RDSを使ってMySQLを立てています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.mysql.com/jp/">MySQL</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/rds/">Amazon RDS</a></li> </ul> <h3 id="Amazon EFS"><a href="#Amazon+EFS">Amazon EFS</a></h3> <p>複数のインスタンスで学習データや学習済みモデルを共有できるようにAWSのAmazon EFSというネットワークファイルシステムを使っています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/efs/">Amazon EFS</a></li> </ul> <p>AIメーカーではフロントサーバとバックエンドサーバで分かれており、そこの連携が肝になってきます。<br /> そこでAmazon EFSを使うことで、全インスタンスで同じファイルを共有することができるので、めんどいことを考えなくてもよくなります。</p> <p>サーバをスケールさせる際に問題となってくるのがデータが格納されるDBとファイルになるかと思います。<br /> Amazon EFSを使うことでファイルの読み込みや書き込みの速度は犠牲になるため、ユースケース次第かと思いますが、この辺の問題を考えなくてもよくなります。</p> <p>ただ、ストレージ料金が高いのが悩みの種です。。><</p> <h3 id="PHP"><a href="#PHP">PHP</a></h3> <p>フロントサーバ側のプログラムはPHPを使って実装しました。<br /> フレームワークはZend Frameworkを使用しています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://www.php.net/">PHP</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://framework.zend.com/">Zend Framework</a></li> </ul> <h3 id="Python"><a href="#Python">Python</a></h3> <p>バックエンドサーバ側のプログラムはPythonを使って実装しました。<br /> フレームワークはFlaskを使用しています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.python.org/">Python</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://flask.pocoo.org/">Flask</a></li> </ul> <h3 id="Caffe"><a href="#Caffe">Caffe</a></h3> <p>Deep LearningのフレームワークはCaffeを使用しています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://caffe.berkeleyvision.org/">Caffe</a></li> </ul> <h3 id="jQuery"><a href="#jQuery">jQuery</a></h3> <p>クライアント側のJavaScriptは、jQueryを使って実装しました。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://jquery.com/">jQuery</a></li> </ul> <h2 id="実装方法"><a href="#%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95">実装方法</a></h2> <p>AIメーカーを作るにあたって、一般的なwebサービスにはない機能をどう実装しているかをご紹介します。<br /> 主に以下の機能について、まとめてみます。</p> <ul> <li>学習データの自動収集</li> <li>モデルの学習</li> <li>モデルの推論</li> </ul> <h3 id="学習データの自動収集"><a href="#%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%87%AA%E5%8B%95%E5%8F%8E%E9%9B%86">学習データの自動収集</a></h3> <p>ディープラーニングで画像分類のモデルを作る際には、AIにこの画像は〇〇であるということを教えるため、学習データにラベル付けを行います。<br /> この学習データのラベル付けは、モデルの精度に大きく影響する重要な作業ですが、単調な作業なためにとても退屈です。</p> <p>そこで、AIメーカーでは事前に登録していたラベル名から画像データを自動で収集する機能を用意いたしました。<br /> ちなみにこちらの機能はAidemyの石川さんよりアドバイス頂いた機能です。大感謝!</p> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">学習データを各ラベル名から自動で収集する機能を実装!これはなんとAidemyの石川さん(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/ai_aidemy?ref_src=twsrc%5Etfw">@ai_aidemy</a>)よりアドバイス頂いたアイディアです!大感謝!!僕も最近始めたところですが、Aidemyは機械学習、ブロックチェーンなど最新の技術も勉強できておすすめです!<a target="_blank" rel="nofollow noopener" href="https://t.co/gORhd5P7Ls">https://t.co/gORhd5P7Ls</a><a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/AI%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#AIメーカー</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/2cNpjzjPAl">pic.twitter.com/2cNpjzjPAl</a></p>— 2z / AIメーカー開発 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1015879835753672705?ref_src=twsrc%5Etfw">2018年7月8日</a></blockquote> <p>ラベル名からの画像データの収集は、Bing Image Search APIを使用しています。<br /> 一つのラベルごとに50件の画像データを収集するようにしています。</p> <p>この学習データの収集はブラウザからAjax通信でリクエストを投げ、サーバ側でバックグラウンドで処理させています。<br /> 処理時間はラベル数によりますが、少なくとも数分はかかるので、単純にリクエストを投げて応答を待っていると通信がタイムアウトしてしまう可能性があります。<br /> そこで、サーバ側にリクエストを投げたら一度データベースへその処理をタスクとして保存しておき、一旦ブラウザ側へレスポンスを返しています。</p> <p>サーバの裏側では常にデーモンが監視(待機)しているので、データベースへ学習データの収集タスクが登録されたら、収集処理が開始されるようになっています。<br /> また、ブラウザ側では定期的にその進捗状況をAjax通信で見に行く(ポーリングする)ようにしています。</p> <p>なお、AIメーカーでは手軽に利用できるように学習データの自動収集機能は用意しておりますが、それだけだと質の良い学習データは用意できないため、JPG、PNG、ZIPによる画像データのアップロードにももちろん対応しています。</p> <h3 id="モデルの学習"><a href="#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AD%A6%E7%BF%92">モデルの学習</a></h3> <p>モデルの学習といえば、AIメーカーの根幹の機能になります。登録された学習データをもとにモデルを学習させます。</p> <p>先のシステム構成図で示しましたが、AIメーカーにはフロントサーバとバックエンドサーバがあり、モデルの学習はバックエンドサーバで行います。<br /> 具体的には以下の流れで行います。</p> <p>1. フロントサーバ側で学習データに不足がないかチェック</p> <p>2. フロントサーバ側でCaffeで学習を開始するのに必要なファイルを生成する</p> <ul> <li>deploy.prototxt、solver.prototxt、train_val.prototxtを生成</li> <li>学習データのファイルパス、ラベルのテキストデータを生成(全データのうち、90%を学習に使用)</li> <li>テストデータのファイルパス、ラベルのテキストデータを生成(全データのうち、10%をテストに使用)</li> </ul> <p>3. フロントサーバ側からAmazon EC2のGPUインスタンス(バックエンドサーバ)を起動する</p> <ul> <li>既に作成済みのインスタンスがある場合はそのインスタンスを起動する</li> <li>まだ起動済みのインスタンスがない場合は新たにインスタンスを作成して起動する</li> </ul> <p>4. インスタンスの起動後、セットアップスクリプトを実行(具体的には以下のことをやっています)</p> <ul> <li>Amazon EFSのマウント</li> <li>最新のソースをGitHubからpull</li> <li>FlaskをuWSGIサーバで起動し、リクエストを受付できるようにする</li> </ul> <p>5. バックエンドサーバへの疎通確認後、フロントサーバからバックエンドサーバへCaffeの学習開始のリクエストを投げる</p> <p>6. バックエンドサーバ側でリクエストを受け、Caffeの学習コマンドを実行する</p> <ul> <li>LMDBの作成<br />   リストファイルは先の2で生成しておいたテキストデータを指定します。<br />   EFSでファイルを共有しているため、そのままファイルの同期とか考えなくてもそのまま使えます</li> </ul> <pre><code>convert_imageset -resize_height=227 -resize_width=227 -shuffle / {学習データのリストファイル} train_lmdb convert_imageset -resize_height=227 -resize_width=227 -shuffle / {テストデータのリストファイル} test_lmdb </code></pre> <ul> <li>平均画像の作成</li> </ul> <pre><code>compute_image_mean train_lmdb mean.binaryproto compute_image_mean test_lmdb test_mean.binaryproto </code></pre> <ul> <li>学習を実行<br />  学習ログファイルへ進捗状況が出力されていきます</li> </ul> <pre><code>caffe train -solver=solver.prototxt -weights {モデル} 2>&1 | tee {学習ログファイル} &") </code></pre> <p>7. フロントエンドサーバ側で学習ログファイルから進捗状況を把握し、学習状況をグラフで表示</p> <p>学習ログファイルはAmazon EFSで共有しているので、そのログの中から正規表現でせっせと該当値を抽出します</p> <pre><code>if (preg_match('@] Test net output #0: accuracy = ([0-9.e\-]+)@', $record[$i], $matches)) { $accuracy = rtrim(rtrim(sprintf('%F', $matches[1]), '0'), '.'); } if (preg_match('@] Test net output #1: loss = ([0-9.e\-]+)@', $record[$i], $matches)) { $loss_test = rtrim(rtrim(sprintf('%F', $matches[1]), '0'), '.'); } if (preg_match('@] Iteration [0-9]+, loss = ([0-9.e\-]+)@', $record[$i], $matches)) { $loss_train = rtrim(rtrim(sprintf('%F', $matches[1]), '0'), '.'); } </code></pre> <p>8. 学習完了後、バックエンドサーバ側でモデルが生成される</p> <p>9. フロントサーバ側でログから学習完了を検知し、学習結果をデータベースへ保存し、EC2インスタンスを停止する</p> <p>以上が処理の流れになります。</p> <h3 id="モデルの推論"><a href="#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E6%8E%A8%E8%AB%96">モデルの推論</a></h3> <p>学習が完了し、生成されたモデルを使って画像分類の推論を行う機能です。<br /> こちらは以下の処理で行っています。</p> <p>1. ユーザーさんが推論したい画像をブラウザからアップロード</p> <p>2. フロントサーバで画像データを保存し、バックエンドサーバへ画像ファイルパスをパラメータに推論のリクエストを投げる</p> <p>3. バックエンドサーバでリクエストを受け、Caffeで推論処理を実行し、結果をJSON形式で返す</p> <p>4. フロントサーバでレスポンスを受け取り、推論結果をグラフで表示する</p> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p>今回、特にAIメーカー特有の機能に絞って、実装方法をまとめてみました。<br /> AIメーカーではフロントサーバとバックエンドサーバの複数インスタンスで構成し、それぞれを連携させて実現している箇所が多いため、多少複雑になっています。</p> <p>実際に作ってるときは頭の中でシステム構成をイメージして実装を進めていますが、後で見返すとどうだったっけな?となることがほとんどです。<br /> このへんはきちんとメモするか、図解するかしてきちんと残しておいた方がよさそうですね。</p> <p>なお、AIメーカーでは誰もが手軽にシンプルに使えること、そして学習が早く終わるようにするため、現時点ではモデルの精度を犠牲にしています。</p> <p>そのため、今後は精度向上のために学習の際のハイパーパラメータのチューニングをしたいとか、学習の回数をもっと増やしたいとかなどの要望に応えられるようにする必要があると感じています。</p> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">学習自体はサーバ側でGPUを使ってやってます。ただ、まずは手軽に利用できるように学習時間を大幅に削減するべく、本来もっと学習すべきエポック数を少なくしてるので、精度はそんなに出ないのが現状です。こちら、精度を上げたい方はオプションでパラメータ調整を可能にしたり等、今後の課題です! <a target="_blank" rel="nofollow noopener" href="https://t.co/ZNfOUGxtS9">https://t.co/ZNfOUGxtS9</a></p>— 2z / AIメーカー開発 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1020564024935583744?ref_src=twsrc%5Etfw">2018年7月21日</a></blockquote> <p>今後、このあたりの機能拡張も行っていきたいと思います。</p> <hr /> <p>この記事に少しでも興味をもって頂けましたら、ブログの<a target="_blank" rel="nofollow noopener" href="http://blog.hatena.ne.jp/no2z1/sukimanote.hatenablog.com/subscribe">読者登録</a>やTwitter: <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01">@2zn01</a>をフォローして頂くと更新の励みになります!</p> <p>皆さんもぜひ自分のサービスを作っていきましょう!</p> 2z@AIメーカー