エクサウィザーズ Engineer Blog

株式会社エクサウィザーズのエンジニアチームブログ

写真に写っていないところを復元する

f:id:kentaro-suto:20181024193158p:plain

こんにちは。エクサウィザーズAIエンジニアの須藤です。

みなさんはハイキングの写真でしずちゃんばかり写して、まともに撮られなかったジャイアンに殴られかけたことは無いでしょうか。 そんなとき「万能プリンター」があったら便利ですね。もう撮ってしまった写真の、向きやズームを後から修正して、写ってなかったところを復元して再プリントできるというものです。 しかし持ち主であるドラえもんは、うちにもまだ来ていません。仕方がないのでAIの力でなんとかしましょう。

目的

写真の外側に写っているものを推測し、自然な形で合成します。

f:id:kentaro-suto:20181024190925p:plain:w200

物体の部分画像からその種類ないし位置を推測し、既存画像を本に全体を復元することが、原理的には可能なはずです。 その過程を直接にプログラムすることは現実的ではありません。 代わりに畳み込みニューラルネットワーク(CNN)に、かいつまんで学習させます。

学習モデル

敵対的生成ネットワーク(GAN)のアルゴリズムに従います。目的に書いたとおりのことを行う生成器と、画像の本物らしさを判別する判別器を、交互に学習します。 f:id:kentaro-suto:20181024153648j:plain

  • 生成器を以下のように構成します。
    • 画像を特徴量マップにする多層CNN
    • 特徴量マップを縦横二倍に広げる多層転置CNN
    • 特徴量マップから画像を生成する多層転置CNN
  • 事前学習を行います。
    • 真ん中だけを切り取った画像から元の画像を生成するように、生成器を学習
  • 画像が本物かを判定する判別器を構成します。
  • 以下の学習を交互に繰り返します。
    • 生成器を通した画像に対して0、本物の画像に対して1を返すように、判別器を学習
    • 生成した画像に対して判別器が1を返すように、生成器を学習

データセット

はじめ様々な物体を含む画像データセットで学習を行いましたが、外周部のピクセルの色を拡散させる以上のことをしてくれませんでした。 どんな写真にも対応させるには、学習時間またはモデルの性能が不足しているようです。

そこで顔画像データセットであるLabelled Faces in the Wildを用いて学習することにしました。 処理すべき情報量が減るため、少なくとも顔の部分に関しては精度の高い結果が期待できます。 一方で、使い道が想像つかなくなりましたが、モデルの検証が目的ということでご理解ください。

結果

入出力の例です。本来の全体画像も正解として記載します。 入力画像はエクサウィザーズのメンバー紹介ページから借りました。

入力 出力 正解 コメント
f:id:kentaro-suto:20181024173438p:plain f:id:kentaro-suto:20181023105104p:plain f:id:kentaro-suto:20181023105052p:plain ネクタイができかけています。
f:id:kentaro-suto:20181024173458p:plain f:id:kentaro-suto:20181023105619p:plain f:id:kentaro-suto:20181023105603p:plain なぜか法衣みたいに。
f:id:kentaro-suto:20181024173509p:plain f:id:kentaro-suto:20181023104451p:plain f:id:kentaro-suto:20181023104439p:plain 背景のボケがいい感じに。予測モデル的には失敗です。
f:id:kentaro-suto:20181024173538p:plain f:id:kentaro-suto:20181023104803p:plain f:id:kentaro-suto:20181023104751p:plain これまた作務衣のよう。
f:id:kentaro-suto:20181024173600p:plain f:id:kentaro-suto:20181023105944p:plain f:id:kentaro-suto:20181023105934p:plain ワイルドに。
f:id:kentaro-suto:20181024173618p:plain f:id:kentaro-suto:20181023110015p:plain f:id:kentaro-suto:20181023110003p:plain ムーディーに。
f:id:kentaro-suto:20181024173631p:plain f:id:kentaro-suto:20181023105919p:plain f:id:kentaro-suto:20181023105907p:plain 背景色がきっちり伸ばされているところに注目。
f:id:kentaro-suto:20181024173712p:plain f:id:kentaro-suto:20181023104826p:plain f:id:kentaro-suto:20181023104814p:plain 髪型提案モデルとして使えるかも。
f:id:kentaro-suto:20181024173730p:plain f:id:kentaro-suto:20181023104742p:plain f:id:kentaro-suto:20181023104734p:plain はみ出るのが少ないと変な結果になりにくいです。
f:id:kentaro-suto:20181024173903p:plain f:id:kentaro-suto:20181023104723p:plain f:id:kentaro-suto:20181023104712p:plain 髪の毛が大増量です。
f:id:kentaro-suto:20181024173924p:plain f:id:kentaro-suto:20181023105652p:plain f:id:kentaro-suto:20181023105633p:plain 無地の背景はなんとかして避けようとします。
f:id:kentaro-suto:20181024173949p:plain f:id:kentaro-suto:20181023105721p:plain f:id:kentaro-suto:20181023105706p:plain 首を隠すとなぜか太くなりがちです。
f:id:kentaro-suto:20181024174015p:plain f:id:kentaro-suto:20181023105551p:plain f:id:kentaro-suto:20181023105521p:plain 襟があるかないか決めかねたようです。
f:id:kentaro-suto:20181024174026p:plain f:id:kentaro-suto:20181023111924p:plain f:id:kentaro-suto:20181023111914p:plain 妙にごつくなりました。
f:id:kentaro-suto:20181024174041p:plain f:id:kentaro-suto:20181023105757p:plain f:id:kentaro-suto:20181023105735p:plain やたらきらびやかになりました。
f:id:kentaro-suto:20181024174114p:plain f:id:kentaro-suto:20181023105438p:plain f:id:kentaro-suto:20181023105428p:plain ビシッと黒スーツです。

髪の毛や顎など、画像中に無いものが付け足されています。背景や髪の毛の色もある程度反映されます。手がかりが全くない場合、髪型は丸刈り、服装は黒スーツになるようです。

デモ

ブラウザ上で動作するデモを用意しました。こちらのページですぐに試すことができます。 https://base.exawizards.com/view/modelDetail?id=45

操作説明

f:id:kentaro-suto:20181023102234p:plain ページ下部のリンクをタップしてください。モデルのダウンロードが始まります。12MBほどあるので、通信環境によってはお時間をいただきます。
f:id:kentaro-suto:20181023104008p:plain お手持ちの顔写真を選択してください。計算は全てブラウザ上で行われます。写真データが外部に送信されることはありません。
f:id:kentaro-suto:20181023102321p:plain 写真が読み込まれました。写真を直接ドラッグすることで位置を、スライダーではスケールを調節できます。
f:id:kentaro-suto:20181023102406p:plain 顔が白い枠いっぱいに表示される状態になったら、決定ボタンを押してください。計算が始まります。
f:id:kentaro-suto:20181023102421p:plain 枠内の内容だけから再生成された画像が表示されます。別のファイルを選択するか、位置を変える操作を行うと、再計算ができます。

まとめ

学習に基づき写真の範囲を拡張するAIモデルを作りました。

本手法はこんなときに役に立つ、かもしれません。

  • 不完全な写真からポートレートを作成
  • 構図の良くない写真を修正
  • 写真一枚から環境マップを生成
  • 4:3の映像を16:9のテレビで見る際の余白埋め

尚、エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い”ウィザーズ”を募集しています。ご興味を持たれた方はぜひご応募ください。 採用情報|株式会社エクサウィザーズ

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter (https://twitter.com/BlogExawizards) で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!

マルチモーダルAIロボットをGTC Japan 2018に展示しました(中編)

こんにちは、エクサウィザーズAIエンジニアの柳元です。

今回はGTC Japan 2018の参加報告として、いくつかの展示や講演の簡単な紹介をしていきます。

スポンサー展示

株式会社コンピュータマインド f:id:mikuyanagimoto:20180920111246j:plain 物体検出・分類の事前学習モデルを提供するライブラリの展示です。 一般的なライブラリと異なり、学習ではなく推論に特化することで、高速に推論結果を得られます。 主にC/C++で実装されており、依存するライブラリ数が少なく、導入も容易です。 追加学習機能も今後実装予定とのことです。

コマツ f:id:mikuyanagimoto:20180920111340j:plain 大迫力のショベルカーの展示です。 単眼カメラから人を検出し、その距離を検出します。 また、地形を変えるのは本来高い技術を必要とされる作業ですが、 GNSSアンテナから得られる位置情報に基づき、バケットが設計面に沿って自動で動きます。 そのため、アームレバー操作のみで作業ができます。 f:id:mikuyanagimoto:20180920111351j:plain 3つのディスプレイのうち、上2つが人検知、下1つが地形情報を表しています。

ヤマハ様 f:id:mikuyanagimoto:20180920111706j:plain 自動運転ワンマイルモビリティの展示です。 ハンドル・ブレーキ・アクセルがなく、レベル4の自動運転(特定の場所でシステムが全てを操作)を目指しています。 例えば、ゴルフ場やホテルに導入することで、ゲストは施設内を自由に移動することができます。

ピュア・ストレージ様 f:id:mikuyanagimoto:20180920111724j:plain AIインフラストラクチャであるAIRIの展示です。 Deep learningなどの機械学習に用いるAIサーバは高価であるため、サーバを増やすだけ性能が上がることが望ましいと考えられ、
そのためには継続的パラメータチューニングが必要とされます。 AIRIにはコストパフォーマンスを最大化するための最適化が施されています。

パナソニック様 f:id:mikuyanagimoto:20180920111915j:plain 監視カメラから特定の人物を検出する顔認証技術を搭載したセキュリティシステムFacePROの展示です。 事前にある人物の顔情報を登録しておけば、サングラスやマスクをつけた状態であったとしてもその人物を検出できます。

講演

尾形哲也先生 「ディープニューラルネットの力学的構造設計による複数動作の統合」というタイトルで
ロボットの学習方法に関する発表をして頂きました。 モーションプリミティブとは、人間のほとんどの動作を構成する要素のことで、組み合わせたり、並べたりすることで、複雑な動作を生成することができると言われています。 モーションプリミティブは、軌道を構成するそれぞれの値によって表現されるのではなく、
軌道パターンによって表現される、と述べられました。 LeCunのケーキは学習の難しさ(あるいは知能における重要さ)を表しており、そのことがモーションプリミティブの獲得に強化学習が常に最適であるとは言えず、予測学習も重要である、と述べられました。
 f:id:mikuyanagimoto:20180920112236j:plain 尾形先生はエクサウィザーズロボット事業の技術顧問でもあります。 株式会社日立製作所様のブースと並んで
エクサウィザーズブースの秤量デモや昨年の双腕型マルチモーダルAIロボットをご紹介頂きました。

長井隆行先生 「人と共存するこれからのAI x ロボティクス」というタイトルで、
ロボットを通してヒトを理解する取り組みに関する発表をして頂きました。 理解とは予測であり、感情とは自分自身に対する予測であるとし、ロボット工学における感情の研究が必要であることを述べられました。 シミュレーション上で赤ちゃんを模したエージェントに、母親の表情(感情)を模倣させる学習させる研究において、エージェントにとって完全に予測不能な恐怖信号が時折与えられる環境下では、全ての信号が予測可能な環境に比べて複雑な感情表出をするようになるという結果が得られ、その内部表現を低次元に圧縮・プロットすると喜怒哀楽がまるで感情の円環モデルのようになった、というのがとても面白いと思いました。

浅谷学嗣(先生) 「マルチモーダルAIによる協働ロボットの行動獲得・制御の可能性」というタイトルで発表しました。 発表の詳しい内容は、本ブログの後編として後日UP予定ですので、是非ご覧ください!

Dieter Fox先生 “Robotics research at NVIDIA”というタイトルで自身の研究内容について発表頂きました。 研究テーマの1つに、物体の6D姿勢推定(3D translation + 3D rotation)があります。 ロボットが人とインタラクティブに学習したり、協働するためには、実世界という環境を認識できる必要があります。 しかし、物体の6D姿勢推定は簡単な問題ではなく、物体それぞれが異なる形状を有しており、加えて外観も照明条件や周囲環境の乱雑さ、物体間のオクルージョンの影響を大きく受けるからです。 従来的には、特徴点のマッチングやテンプレートベースな手法が使われていますが、それぞれテクスチャとオクルージョンの問題を抱えています。 ここで紹介されたPoseCNNは、6D姿勢推定のための汎用フレームワークとなるend-to-endな畳み込みニューラルネットです。 f:id:mikuyanagimoto:20180921122825p:plain 上図のように、姿勢推定タスクに必要な要素を切り分けることで、ネットワークがそれらの関係性を明示的にモデル化します。 また、DeepIMは推定結果をさらによいものにします。 f:id:mikuyanagimoto:20180921124050p:plain 姿勢推定結果が与えられると、画像中の物体がレンダリングされた視野と一致するSE(3)変換を予測します。 これを反復することにより、正確な姿勢を推定することができます。 液体:https://arxiv.org/pdf/1703.01564.pdf

おわりに

エクサウィザーズのブースにはたくさんの人に見に来て頂き、盛況のうちに終了しました。 f:id:mikuyanagimoto:20180920112737j:plain また、講演にもたくさんの方にお集まり頂きました。 足を運んでくださった皆様、ありがとうございました!

なお、エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い“ウィザーズ”を募集していますので、
ご興味を持たれた方はぜひご応募ください。

採用情報|株式会社エクサウィザーズ

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。
Twitterで更新情報を配信していきますので、ぜひフォローをよろしくお願いします!

おまけ

f:id:mikuyanagimoto:20181001125913g:plain

  1. 何をしているのでしょうか?
  2. データの収集をしています。カメラのブレ、認識対象物以外の物体(人の手など)の映り込みや移動に対して ロバストな表現を学習できるような訓練データを効率的に集められるのが上の浅谷式です。 動画はこちら

京都大学にてKDDの論文読み会を開催します

京都大学にて、京都大学(人工知能研究ユニット)・理化学研究所革新知能統合研究センター(AIP)・株式会社エクサウィザーズ共催のKDD論文読み会を開催します。

KDDはデータマイニング領域のトップカンファレンスです。

参加はCompassからお願いします。読み手も募集しておりますので、興味のある方はぜひご応募ください!

https://connpass.com/event/102181/

  • 日時:10月11日(木)13:00-18:00(開場12:30)

  • 会場:京都大学 総合研究15号館(参加人数により建物は変更になる可能性があります) http://www.ai.kyoto-u.ac.jp/access-ja/

論文はこちらからダウンロードが可能です。 http://www.kdd.org/kdd2018/accepted-papers

※ 本読み会は、エンジニア、研究者、学生限定のイベントです。

エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い"ウィザーズ"を募集しています。 ご興味を持たれた方はぜひご応募ください。採用情報 | 株式会社エクサウィザーズ 

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter (https://twitter.com/BlogExawizards) で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!

マルチモーダルAIロボットをGTC Japan 2018で展示します(前編)

こんにちは、エクサウィザーズAIエンジニアの柳元です。

エクサウィザーズはGTC Japan 2018に参加します!

GTC Japanには昨年もマルチモーダルAIロボットを出展しました(後述)。 今年はエンタープライズや研究における用途を意識した「秤量」と「パレタイジング」のデモを行います。

秤量デモ

youtu.be

※ ナレーションは、GTC Japan 2018に登壇予定の浅谷です。音声にご注意ください。

調剤現場では秤量(はかりで重さを量る)作業が大量にあり、労働力がかかる上、危険な薬品を扱う際のリスクがあるため、ロボットによる秤量の自動化が望まれています。自動秤量は、調剤だけでなく、料理にも活用可能と考えられます。

今回の秤量デモでは、都度与えられる量と等しくなるように、ロボットが塩をスプーンですくい、所定の位置に盛ります。

f:id:taichiroendo:20180910181247j:plain

f:id:mikuyanagimoto:20180907164334p:plain

両サイドのUSBカメラの情報から塩の盛られた場所を認識し、さまざまな量の塩をスプーンですくえるようニューラルネットワークを学習させました。

f:id:mikuyanagimoto:20180908102253p:plain

デモでは、サーバー上の学習済みニューラルネットワークがAPIを通じてデータを受信し、行動(ジョイント角)をリアルタイムで生成します。

f:id:mikuyanagimoto:20180912173805p:plain

パレタイジングデモ

youtu.be

このタスクは、パレットから正しい順序で部品をとり、重ねることで組み付けを行うものです。 一見単純なタスクですが、パレットから部品が抜け落ちるなどの例外処理をロボットプログラムのみで記述するのは手間がかかります。 さらに、人とロボットが協働できるよう条件分岐を書くのは至難の技です。

今回組み付けるのはレゴカーです。手順は、①まず青のパレットからシャーシをとり、黒のワークスペースに置きます。 ②次に、銀のパレットからルーフをとり、黒のワークスペース上のシャーシに組み付けます。

f:id:mikuyanagimoto:20180907173507p:plain

カメラから得られた各パレット情報などに基づいてロボットが状況判断します。 タスクに人が介入したり、誤ってパーツを落としたりした場合などを認識し、適切に行動します。

おわりに

動画内容は実験段階のものであり、当日のデモは大きく変わっております。 また、見に来て頂いた皆さまに楽しんでもらえるよう、インタラクティブなデモを考えております!

GTC Japan 2018は9/13(木), 14(金)の日程でグランドプリンスホテル新高輪 国際館パミールにて開催されます。 エクサウィザーズのブースは1階ロボット展示エリアにあります。 弊社の浅谷は9/14(金) 11:25 - 11:50に1階Room 1 - 3にて講演します。

ぜひ遊びに来てください!

なお、エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い”ウィザーズ”を募集していますので、ご興味を持たれた方はぜひご応募ください。

採用情報|株式会社エクサウィザーズ

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!

おまけ: 昨年の出展内容

www.youtube.com GTC Japan 2017では双腕マルチモーダルAIロボットを展示しました。 従来の製造業用ロボットの常識であった「専用」ロボットではなく、「不特定のタスク」を、「汎用のプログラム」と「汎用のアーム・ハンド」によって実行するマルチタスクロボットです。

与えるデータの変更のみで、同一のマシン・同一のプログラムで複数のタスクが実行できます。

f:id:mikuyanagimoto:20180908190213p:plain

論文が米科学誌「Cell」に掲載されました

こんにちは、エクサウィザーズの遠藤太一郎です。

私が参加した研究プロジェクトの成果が米科学誌「Cell」に掲載されましたので、ご報告です。 画像解析の深層学習のところで貢献しました。

論文のポイントは以下になります。

世界初のIntelligent Image-Activated Cell Sorterを開発 〜細胞画像の深層学習により高速細胞選抜を実現〜

  • 本技術「Intelligent Image-Activated Cell Sorter」は細胞の高速イメージングと深層学習を用いた画像解析で細胞を一つ一つ網羅的に高速識別し、その解析結果に応じて所望の細胞を分取する世界初の基盤技術です。

  • 免疫学、病理学、微生物学、分子生物学、遺伝学、再生医学、移植など多岐に渡る分野で基盤技術として不可欠である高速細胞分取技術「Fluorescence-Activated Cell Sorter」(開発者のHerzenberg氏は本貢献により2006年に京都賞を受賞)に顕微イメージング活性化(Image-Activated)と深層学習(Intelligent)を融合する飛躍的な発展であります。

  • 本技術の原理実証として微生物や血液を用いて細胞の内部分子構造や形態などの様々な空間的情報に基づいた高速細胞分取を実現したことから、今後は生命科学(分子生物学、微生物学、医学、薬学など)における科学的発見およびバイオ産業や医療の発展への寄与が期待されます。

論文は以下のURLから確認可能です。https://doi.org/10.1016/j.cell.2018.08.028

エクサウィザーズでは各種大学や研究機関と、共同研究を始めとし様々な連携を行っています。技術顧問の先生方とのディスカッションを始め、京都大学・理研AIPとの機械学習勉強会など、共催のイベントなども積極的に開催しています。

優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い”ウィザーズ”を募集していますので、ご興味を持たれた方はぜひご応募ください。 採用情報|株式会社エクサウィザーズ

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter (https://twitter.com/BlogExawizards) で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!

自動文書要約

こんにちは。エクサウィザーズAIエンジニアの玉城です。

本やインターネットで調べ物をする際、情報量が多すぎてどこを見たら良いのか分からなくなってしまった、という経験はないでしょうか。このように情報量の豊かさが返って人の判断を鈍らせてしまう問題を情報オーバーロードと言います。

インターネットの普及に伴う情報オーバーロードに対して、自動文書要約の技術が注目されています。今回、exaBaseではディープラーニング技術を活用した自動文書要約モデルを公開致しました。こちらにてソースコードと学習済みモデルをダウンロードし、以下のように英文ニュース記事から簡潔な要約文が生成可能なのでぜひ試してみてください。

原文(学習時に使用していないデータ) :f:id:d_tamaki:20180816195339p:plain

モデルが出力した要約文:

spotify believes it has identified the average age of midlife crises at 42 .
users aged around 42 drop their usual playlists which usually contain hits from their youth in favour of today 's chart toppers from the likes of rihanna and sam smith .

人間が作成した要約文:

spotify believes it has identified the average age of midlife crises at 42 .
staff analysed data and found users aged 42 drop their usual playlists .
start listening to today 's chart toppers , such as rihanna and sam smith .

本記事では以下のような構成で自動文書要約の種類などの基本的な概念やディープラーニングを中心とした研究動向、exaBase掲載モデルの詳細をご紹介していきたいと思います。

自動文書要約の種類

自動文書要約は以下のような観点で分類されます。

  • 入力方式
    • Single document:単一の文書
    • Multi-document:複数の文書
  • 条件付け
    • Generic:特に指示を出さない
    • Domain specific:特定の分野に特化
    • Query-based:与えられた質問やキーワードに対する要約
  • 要約範囲
    • Informative:重要な内容を網羅
    • Indicative:文章を読むべきか判断する情報を示す。本や映画のレビュー等
  • 出力スタイル
    • Keyword:キーワードのみ
    • Headline:ニュース記事のヘッドラインのように、一行のみ出力
    • その他指定された長さの要約文
  • 要約手法
    • Extractive:元の文章から抽出
    • Abstractive:人による要約のように文章の言い換えを利用する

古典的手法

ディープラーニング以前は以下のような人によって定義された特徴を用いた手法が主流でした。

  • 情報の出現頻度
    • 重要な情報ほど高い頻度で出現すると仮定し、キーワードやキーコンセプトを抽出
    • それらを多く含むセンテンスを高く評価
  • センテンス間の類似度
    • 他のセンテンスと類似するセンテンスはその文書の核となる情報を持っていると仮定
    • 検索エンジンで用いられるPage Rankアルゴリズムなど、文章のグラフ構造を用いる
  • その他
    • title feature::タイトルに含まれる単語を含むセンテンスを高く評価
    • sentence position:初めや最後のパラグラフに重要なコンセプトが含まれていると仮定
    • keyword frequency:Query-based要約の場合、キーワードを多く含むセンテンスを高く評価

ディープラーニングを用いた手法

近年は機械翻訳などの自然言語処理タスクにおいてディープラーニングを用いるのが一般的になってきましたが、自動文書要約においても同様の傾向があります。ここではディープラーニングを用いたExtractive/Abstractive手法を紹介します。

Extractive Summarization (抽出型)

CNN

CNNはコンピュータービジョンの分野でよく用いられる手法ですが、自動文書要約にも応用されています。

Extraction of Salient Sentences from Labelled Documents f:id:d_tamaki:20180816201544p:plain

Word Embedding(単語の分散表現)は自然言語処理ではモデルへ単語を入力する手法として広く使われています。こちらの論文ではWord Embeddingを拡張したSentence EmbeddingとDocument Embeddingを導入しています。まず、センテンス単位でWord Embeddingを結合させたSentence Matrixに対してCNNを適用することでそのセンテンスの分散表現であるSentence Embeddingを生成、同様の手法でDocument Embeddingを生成します。最終的にはDocument Embeddingから元の文章のクラス分類ができるように学習します。

では上記モデルをどのように文書要約タスクへ役立てれば良いでしょうか?CNNを用いたコンピュータービジョンの分野では可視化技術を用いて、どの入力値がロス関数に対して大きく作用しているかを算出することが可能です。本論文ではSentence Embeddingを経由することで、単語単位ではなくセンテンス単位での影響度の数値化を可能にしました。この値をそのセンテンスの重要度と捉え、上位k個のセンテンスを抜き出すことで要約文を生成しています。

通常自動文書要約タスクは教師ラベル(センテンスを抽出すべきか否か)の作成コストが非常に高いですが、本手法では文書のクラス分類ラベルのみを使用することでコストを大幅に抑えています。また、生成された要約文書を入力としたクラス分類を実施することである程度要約文の質を測ることが可能なようです。

CNN + Seq2Seq + Attention

Sequence-to-Sequence + Attentionは機械翻訳の分野で多用される技術です。 通常Attentionは「デコードする際に入力のどの部分に着目すべきか」を判断するのに用いるのですが、こちらの論文ではAttentionの値を元に直接センテンスの抽出を行なっています。

Neural Summarization by Extracting Sentences and Words

f:id:d_tamaki:20180816201726p:plain

まず、Word Embeddingで入力されたセンテンスに対してCNNを適用します(sentence encoder)。出力されたセンテンスのベクトルを順次LSTMに入力することでドキュメントを表現する隠れ層が生成されます(document encoder)。センテンスの抽出にはもう一つLSTMを準備します(sentence extractor)。

f:id:d_tamaki:20180816210729p:plain:w300


あるタイムステップにおけるsentence extractorの隠れ層は直前のタイムステップの隠れ層と値pによって重み付けされたセンテンスのベクトルによって決定されます。この値pこそがセンテンスが抽出されるべきか判断する指標となります(pが大きいほどそのセンテンスの重要度が高い)。pの値はdocumenter encoderとsentence extractorの隠れ層を結合したベクトルをMLP(多層のニューラルネットワーク)に入力し、シグモイド活性化関数を介することで0から1の間の数値として得ることができます。

Abstractive Summarization (抽象型)

抽象型の自動文書要約においてもやはりSequence-to-Sequenceモデルを使用するのが主流のようです。こちらの論文ではSequence-to-Sequence + Attentionをベースラインモデルとし、そこに二段階の改良を加えています。

Get To The Point: Summarization with Pointer-Generator Networks

まずは以下をご覧ください。

f:id:d_tamaki:20180816204003p:plain

一番上の段がソーステキストで、要点が青字になっています。その下の段がベースラインのSequence-to-Sequence + Attentionの出力例です。純粋な抽象型の要約手法なので、人名などあらかじめ準備された辞書に存在しない単語(OOV)を出力することができません。また、要約精度もあまり高くなく、事実に反する要約内容が見られます。次の段はベースラインモデルにPointer-Genを加えた、抽象型と抽出型の良いとこ取りをしたモデルの出力です。ソーステキストから人名を抽出できており、要約内容も事実に沿ったものとなっています。ただし、同じ内容を繰り返すクセがあります。一番下の段にあるのがベースライン + Pointer-GenにCoverage機能を付け足たしたモデルの出力で、繰り返し問題が解消されています。

では、ベースラインモデルから一つずつ見ていきましょう。

ベースラインSequence-to-Sequence + Attention

f:id:d_tamaki:20180816204118p:plain

ベースラインモデルは純粋な抽象型モデルです。まず、ソーステキストの単語のWord Embeddingが一つずつエンコーダーである双方向LSTMに入力され、Encoder Hidden Statesシーケンスが生成されます。文章内のある単語を推測する際、その単語の前だけではなく、後ろにあるテキストの情報があった方が推測しやすいですよね。なのでエンコーダーにはソーステキストを前向きと後ろ向きで入力する双方向LSTMを用いるのが一般的になっています。

デコーダー(片方向LSTM)側ではEncoder Hidden Statesと前ステップで出力した単語のWord Embeddingが入力され、Decoder Hidden Statesシーケンスが生成されます。

Attention Distribution at は以下のようにEncoder Hidden States h_iとDecoder Hidden State s_tを用いて計算され、「次の単語を出力する際にソーステキストのどの単語に着目すれば良いか」を示してくれます。

f:id:d_tamaki:20180816212415p:plain:w300


Encoder Hidden Statesに対応するAttention Distributionを掛け合わせることで重み付けをし、それらを足し合わせたものがContext Vectorとなります。Context VectorとDecoder Hidden Statesを結合させ、二つの層を経由し最終的にsoftmaxにかけることで準備された辞書から最適な単語を選択しています。

図を見ると"victorious"や"win"という単語へのAttentionによる重み付けが大きいため、最終的に辞書内からそれらに近い"beat"という単語が選択されていることがわかるかと思います。

Pointer-Gen

f:id:d_tamaki:20180816204242p:plain

Pointer-Genモデルは抽象型と抽出型の手法をブレンドしたモデルとなっています。あらかじめ準備された辞書から単語を選択するだけではなく、ソーステキストからの単語の抽出を可能にしました。

ベースラインモデルと比較すると、Pgenというものが追加されています。このPgenが単語を生成するか抽出するかを判断するスイッチのような役割を担います。

Pgenの値はContext Vector h^*_tとDecoder Hidden State s_t、さらにデコーダーへの入力x_tを用いて以下のように 計算されます。

f:id:d_tamaki:20180816213355p:plain:w370


準備された辞書とソーステキストに存在する単語を結合させた新しい辞書Pから単語wが選ばれる確率は以下のように計算されます。

f:id:d_tamaki:20180816213517p:plain:w400


図を見るとソーステキストの"Argentina"という単語が着目されているため、Final Distributionでは辞書内(緑)とオリジナルテキスト内(青)の合計スコアが最も大きい"Argentina"が選択されています。尚、"2-0"のように辞書に存在しない単語においてはPvocabの値は0となります。

Pointer-Gen + Coverage

ベースライン + Pointer-Genのみでは同じ内容を繰り返してしまう問題が生じるので、それを解消するためにCoverage機能を追加します。

まず、タイムステップtまでのAttention Distributionを合計したCoverage Vectorを導入します。

f:id:d_tamaki:20180816213644p:plain:w150


Coverage Vectorはソーステキスト内のそれぞれの単語がどれだけ網羅されたかを知る指標になります。これを以下のようにAttention Distributionを決定する式に織り込みます。

f:id:d_tamaki:20180816234744p:plain:w320


また、以下に定義されるCoverage Lossを通常のロス関数に足し合わせることによって同じ内容の繰り返しに対してペナルティを与えています。

f:id:d_tamaki:20180816234856p:plain:w240


最終的なロス関数は以下のようになります。

f:id:d_tamaki:20180816235018p:plain:w300


モデル評価手法

自動文書分類モデルの評価にはROUGE、BLEU、METEORなど様々な手法が存在します。ここではよく用いられるROUGEによる評価手法を紹介します。

ROUGEにおけるRecall(再現率)とPrecision(同様適合率)

ROUGEでは生成された要約文をレファレンス要約文(多くの場合人の手で作成されたもの)と比較することで評価を実施します。二つの文の比較手法として、RecallとPrecisionという概念を理解する必要があります。

例えば以下のような要約文がモデルから出力されたとしましょう。

there is a pencil and an eraser on the desk

以下はレファレンス要約文です。

there is a pencil on the desk

Recallは以下のように計算されます。

f:id:d_tamaki:20180817005154p:plain


しかし、これだけだとモデルから出力される要約文が長ければ長いほど高いRecallを達成し易くなることにお気づきでしょうか。なので以下のように計算されるPrecisionを考慮する必要があります。

f:id:d_tamaki:20180817005315p:plain


評価には上記RecallとPrecisionの両方を考慮したF-scoreを用います。

f:id:d_tamaki:20180817005342p:plain


ただし、モデルの出力文の長さが制限されているなどPrecisionの値をそれほど気にする必要がない場合にRecallの値のみ使用されることもあります。

ROUGE-N、ROUGE-S、ROUGE-L

  • ROUGE-N:ROUGE-1, ROUGE-2などN-gram単位で生成された要約と正解要約を比較
  • ROUGE-S:単語の組み合わせ(順番は問わない)で評価
  • ROUGE-L:一致する最大のシーケンスで評価

データセット

  • CNN/ Daily Mail
    • 約30万のレファレンス要約付きの英文ニュース記事。各記事は平均39のセンテンスで構成される。
  • DUC 2001~2007
    • 英文ニュース記事の用いた最もメジャーなデータセット。タスクに合わせて以下のようなデータを提供
    • それぞれの記事にSingle document用の短いレファレンス要約(各75byte以下)
    • テーマ毎にクラスタリングされたMulti document用のレファレンス要約(各665byte以下)
  • Annotated English Gigaword
    • 約27GBのニュース記事。ヘッドライン生成タスクに利用可

exaBase掲載モデル

こちらで紹介するモデルは抽象型の要約手法にて紹介した論文Get To The Point: Summarization with Pointer-Generator NetworksGitHubで公開されているソースコードをexaBase環境で実行できるように変更を加えたものです。ソースコードと学習済みモデルはexaBaseにてダウンロード可能です。

以下はモデル構築の一部です。

  def _add_seq2seq(self):
    """Add the whole sequence-to-sequence model to the graph."""
    hps = self._hps
    vsize = self._vocab.size() # 辞書のサイズ

    with tf.variable_scope('seq2seq'):
      # 初期化用
      self.rand_unif_init = tf.random_uniform_initializer(-hps.rand_unif_init_mag, hps.rand_unif_init_mag, seed=123)
      self.trunc_norm_init = tf.truncated_normal_initializer(stddev=hps.trunc_norm_init_std)

      # Word Embeddingを追加(エンコーダーとデコーダーで共有)
      with tf.variable_scope('embedding'):
        embedding = tf.get_variable('embedding', [vsize, hps.emb_dim], dtype=tf.float32, initializer=self.trunc_norm_init)
        if hps.mode=="train": self._add_emb_vis(embedding) # tensorboard用
        emb_enc_inputs = tf.nn.embedding_lookup(embedding, self._enc_batch) # エンコーダーへの入力となるshape (batch_size, max_enc_steps, emb_size)のテンソル。max_enc_stepsは文書あたりの最大単語数。
        emb_dec_inputs = [tf.nn.embedding_lookup(embedding, x) for x in tf.unstack(self._dec_batch, axis=1)] # shape (batch_size, emb_size)のテンソルをmax_dec_steps個含むリスト。max_dec_stepsは出力する要約文の最大の長さ。

      # エンコーダーを追加
      enc_outputs, fw_st, bw_st = self._add_encoder(emb_enc_inputs, self._enc_lens)
      self._enc_states = enc_outputs

      # エンコーダーは双方向LSTMのため、片方向LSTMであるデコーダーに渡せるようにサイズ調整
      self._dec_in_state = self._reduce_states(fw_st, bw_st)

      # デコーダーを追加
      with tf.variable_scope('decoder'):
        decoder_outputs, self._dec_out_state, self.attn_dists, self.p_gens, self.coverage = self._add_decoder(emb_dec_inputs)

      # デコーダーの出力から辞書へのマッピング
      with tf.variable_scope('output_projection'):
        w = tf.get_variable('w', [hps.hidden_dim, vsize], dtype=tf.float32, initializer=self.trunc_norm_init)
        w_t = tf.transpose(w)
        v = tf.get_variable('v', [vsize], dtype=tf.float32, initializer=self.trunc_norm_init)
        vocab_scores = [] # softmax適用前のスコア。リスト内の各アイテムがデコーダーの1ステップ分の出力に対応。
        for i,output in enumerate(decoder_outputs):
          if i > 0:
            tf.get_variable_scope().reuse_variables()
          vocab_scores.append(tf.nn.xw_plus_b(output, w, v)) # 線形レイヤーを適用

        vocab_dists = [tf.nn.softmax(s) for s in vocab_scores] # 辞書へのスコア配分。(batch_size, vsize)の配列をmax_dec_steps個含むリスト。単語の順番はvocabulary fileと同じ。


      # Pointer-generatorモデルの場合はソーステキストの単語を追加して最終スコア配分を計算する
      if DefineFlags.Flags.pointer_gen:
        final_dists = self._calc_final_dist(vocab_dists, self.attn_dists)
      else: # Pointer-generatorでなければvocab_distsが最終スコア
        final_dists = vocab_dists



      if hps.mode in ['train', 'validation']:
        # ロス計算
        with tf.variable_scope('loss'):
          if DefineFlags.Flags.pointer_gen:
            # ステップ単位でのロス計算
            loss_per_step = [] # shape (batch_size)を長さmax_dec_steps含むリスト
            batch_nums = tf.range(0, limit=hps.batch_size) # shape (batch_size)
            for dec_step, dist in enumerate(final_dists):
              targets = self._target_batch[:,dec_step] # shape (batch_size)。ターゲット単語のインデックス取得。
              indices = tf.stack( (batch_nums, targets), axis=1) # shape (batch_size, 2)
              gold_probs = tf.gather_nd(dist, indices) # shape (batch_size)。 このステップの正しい出力単語に対する確信度
              losses = -tf.log(gold_probs)
              loss_per_step.append(losses)

            # dec_padding_mask を適用してロスを取得
            self._loss = _mask_and_avg(loss_per_step, self._dec_padding_mask)

          else: # ベースラインモデル
            self._loss = tf.contrib.seq2seq.sequence_loss(tf.stack(vocab_scores, axis=1), self._target_batch, self._dec_padding_mask) # this applies softmax internally

          tf.summary.scalar('loss', self._loss)

          # Attention distributionからCoverage lossを計算
          if hps.coverage:
            with tf.variable_scope('coverage_loss'):
              self._coverage_loss = _coverage_loss(self.attn_dists, self._dec_padding_mask)
              tf.summary.scalar('coverage_loss', self._coverage_loss)
            self._total_loss = self._loss + hps.cov_loss_wt * self._coverage_loss
            tf.summary.scalar('total_loss', self._total_loss)

    if hps.mode == "summarization":
      # 推論時はbeam searchという手法を使い、ステップ毎にk個(beam size)の候補を保持しておき、最終的に確信度が最も高かった文を出力する。
      assert len(final_dists)==1 # final_distsはshape (batch_size, extended_vsize)のシングルトンリスト
      final_dists = final_dists[0]
      topk_probs, self._topk_ids = tf.nn.top_k(final_dists, hps.batch_size*2) 
      self._topk_log_probs = tf.log(topk_probs)

では早速学習を始めてみましょう。データセットは論文と同じCNN/ Daily Mailを用いています。まずはCoverage無しのベースラインSequence-to-Sequence + Pointer-Genでロスが収束するまで学習をさせます(Tesla K80 GPUにて24時間程度)。

python Document_Summarization_Driver_Main.py --mode=train --data_path=finished_files/chunked/train_* --exp_name=任意の実験名

f:id:d_tamaki:20180816205107p:plain

この段階で推論させるとやはり内容の繰り返しが生じます。

maurice thibaux , 67 , caused quite a stir at sunday night 's opening show held at the carriageworks in sydney 's inner city .
maurice thibaux , 67 , caused quite a stir at sunday night 's opening show held at the carriageworks in sydney 's inner city .

次に、学習したモデルをCoverage用に変換し、Coverageロスが収束するまで学習を継続します(Tesla K80 GPUにて30分程度)。

python Document_Summarization_Driver_Main.py --mode=train --data_path=finished_files/chunked/train_* --exp_name=coverageなし学習で指定した実験名 --coverage=True --convert_to_coverage_model=True

f:id:d_tamaki:20180816205211p:plain

では推論させてみましょう。

maurice thibaux , 67 , caused quite a stir at sunday night 's opening show held at the carriageworks in sydney 's inner city .
the french native who lives next door to the venue crashed the stage to make a complaint .

繰り返しが解消され、より中身の濃い要約文が出力されました。

最後に

今回は自動文書要約における代表的な手法を紹介させていただきました。この分野、特に抽象型の文書要約はいまだ発展途上にありますが、将来的には様々な社会課題の解決に役立つ技術となりそうです。尚、エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い”ウィザーズ”を募集しています。ご興味を持たれた方はぜひご応募ください。 採用情報|株式会社エクサウィザーズ

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter (https://twitter.com/BlogExawizards) で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!

京都大学、理研AIPと共催で機械学習勉強会を行いました

皆さんこんにちは、エクサウィザーズの遠藤です。

はじめましての方向けに簡単にご紹介しますと、エクサウィザーズはAIを利活用することで超高齢社会に代表される様々な社会課題を解決している、スタートアップです。医療、介護、金融、HR、ロボットなど各業界で提携を進め、研究ならびにサービスを開発しています。

これから始めるTechブログでは、技術情報の共有や、勉強会の情報、各種レポートなどを、ご紹介していきたいと思います。

京都大学x理研AIPxエクサウィザーズ 機械学習勉強会

初回の今回は、先日行われた京都大学・理研AIP共催の機械学習勉強会について簡単にレポートしていきます。

f:id:exwzd:20180727153209j:plain

今回、京都大学理研AIPと共催で勉強会を開催させて頂きましたが、それぞれエクサウィザーズとはゆかりがありました。

弊社の創業者である会長の春田・取締役フェローの古屋は京都大学出身であり、今回登壇頂く京都大学の鹿島先生は、弊社の技術顧問もお願いしています。また、私遠藤が所属している理研AIPが京都大学内にラボを作ることになり、AIPで遠藤が所属するユニットのリーダー山田先生が鹿島研の准教授にもなりました。このような縁が重なり、定期的に何かやっていこう!ということで、勉強会が立ち上がりました。

初回の今回は、弊社技術顧問の鹿島久嗣教授、山田誠准教授、京都大学人工知能研究ユニット・ユニット長の下平英寿教授をお招きし、お話頂きました。また、弊社からは桐谷太郎が登壇しました。

鹿島先生

f:id:exwzd:20180806080550j:plain

京都大学/AIPの鹿島久嗣先生には、「Human Computation」というタイトルで、機械学習ではうまく処理できない部分をいかに上手に人間にやってもらうかというお話を頂きました。

山田先生

f:id:exwzd:20180806080631j:plain

京都大学/AIPの山田先生には、「マルチモーダルデータにおける少数ペアデータからの学習」というタイトルで、教師なしで異なるドメイン間のデータをマッチングさせる手法に関してお話頂きました。

下平先生

f:id:exwzd:20180806080706j:plain

京都大学/AIPの下平先生には、「マルチモーダルデータのグラフ埋め込みとニューラルネットワークによる近似定理」というタイトルで、ニューラルネットワークを用いたマルチモーダルデータからの類似度の学習およびその理論についてのお話を頂きました。

弊社桐谷

f:id:exwzd:20180727153314j:plain

弊社桐谷からは、「Graph Convolutional Networkの化合物への応用」というタイトルで、Graph Convolutional Networkを化合物の予測、可視化、生成などに応用し、創薬に繋げていく試みをご紹介致しました。

懇親会

勉強会終了後は、ピザとビールで懇親会を行いました。登壇頂いた先生方にもご参加頂き、活発な議論や交流が行われました。

f:id:exwzd:20180807161235j:plain

今回は80名以上の方にお集まり頂き、大変盛り上がったと思います。皆さんありがとうございました!

エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い"ウィザーズ"を募集しています。 ご興味を持たれた方はぜひご応募ください。採用情報 | 株式会社エクサウィザーズ 

ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter (https://twitter.com/BlogExawizards) で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!