sotetsuk's tech blog

技術系専門書(機械学習)の翻訳体験から学んだこと

技術書(訳書)を出版社から初めて刊行したのですが、その過程で経験したことなどを共有することで誰かの役に立てて貰えれば、と言うのがこの記事の趣旨になります。最近では他にも、"CSの定番教科書「Open Data Structures」を日本にも届けたい!"というプロジェクトもあり、こうした草の根の技術書の翻訳活動がもう少し日本にあってもいいのではと個人的に思っています。理系専門書に邦訳が必要なのかどうか(英語で読めばいいでしょ論)は立場が別れるところだとは思いますが、私は基本的に上記プロジェクト内の次の一文と同じ立場です。

そして、母国語でこのような入門書が読める、少なくともその選択肢があるのは望ましいことだと考えています。

なお、この記事も前の記事に引き続き、2017年に書きかけだった記事の供養です(投稿は2018年の年始)。 年末にやりたかったのですが、年始になってしまいました。。。

どんな本を出版したの?

f:id:sotetsuk:20180102223653p:plain

これは主題とズレるので別記事に譲ります。こちらの記事をご参照ください。 2017年9月に「速習 強化学習 ―基礎理論とアルゴリズム―」という本を刊行しました。Csaba Szepesvari著、"Algorithms for Reinforcement Learning"の訳書になります。 原著はLaTeXで書かれていて数式と擬似コードが多い一方、サンプルコードのようなものはないです。

どういう手順で翻訳したの?

まずは、実際に私達が翻訳する際に踏んだ手順をほぼ時系列順で記述していきます。

1. 企画する

もともとこの翻訳は強化学習の勉強会での輪読からスタートしています。 せっかく洋書を読むなら翻訳しようということで気軽な気持ちで10人くらいでスタートしました。 この時点で著者のC. Szepesvari先生にメールでコンタクトを取って、原著の翻訳とそのフリーでのWeb公開について許可をいただきました。 ただ、後で説明するように、最終的には出版社から出版するということで落ち着きます。

2. 翻訳を開始する

最初は担当を一人5ページずつくらいで分担し、毎週の輪講までにOverleaf上に納品してもらっていました。 この時点ではまだ担当者の理解度の都合もあり、クオリティも非常に低かったです。 一通り埋まるまで2015年10月から2016年3月まで半年近くかかっています。 一通り埋まってからはGitHub上に原稿を移して編集していきました。

3. 監訳をお願いする

翻訳のクオリティの質を上げるためのモチベーションとして、ただ公開するだけでなく出版物にしようかという案が上がりました。 この時点で訳者陣に博士学位持ちがいなかったので、内容・体裁の両方の面で問題があろうということで、監訳を出身研究室のツテで前田新一先生と小山雅典先生にお願いしました。 前田先生は"これからの強化学習"や"深層学習本"にも寄稿されており関連分野に非常に詳しく、小山先生は数学博士で英語がほぼネイティブなので数式の多い洋書の翻訳にあたって心強かったです。

4. 出版社に営業する

前田先生に出版社の営業の方を紹介して頂いて、メールで企画の営業をしました。 幸い、最初に営業をした共立出版さんの方で企画が通り、刊行されることが決まりました(少しすったもんだはありましたが)。 このあとで一度出版社に出向き、印税などの取り決めも口頭でおおよそ合意して、後日書類で契約しました。 出版は決まりましたが、代わりにWeb上でのオープンでの公開は取りやめとなりました。 洋書ではドラフトがpdfダウンロードできる専門書が多いですが、国内ではマーケットサイズの問題もあり、そうした試みは難しいそうです。

5. 版権を取る

これは私達がした作業ではないのですが、出版社の方で版権を取って頂きました。 この作業を踏まないといくら翻訳しても日本で出版できません。

またこのときになって初めて原著者・出版社の方から原著のLaTeXファイルをもらいました。 実はこれまでは数式部分も訳者が手入力していて非常に効率が悪く、ミスも多かったです。 これは完全に最初にやっておくべきでした。

6. 原稿を納品する

いろいろすっ飛ばしますが、原稿を納品します。実は(ありがちですが)締め切りを丸1年近く伸ばしてしましました(2016年夏に納品予定が2017年夏に納品)。

この過程では、

  1. もう一度輪講をして、最初とは別の担当者が確認・修正をする。
  2. 上の原稿を小山先生に(主に英語を中心に)確認・修正してもらう。
  3. 監訳のお二人と私の3人で原稿の読み合わせ・修正をする。(x 3回)
  4. 輪講メンバーを新規で増やしてもう一度読み直して確認する。
  5. 訳書オリジナルの付録を執筆し、前田先生含め他の訳者に確認してもらう。

といった工程があり、その途中で専門用語のチェックや送り仮名を揃えるなどの細かい作業も膨大にありました。 こうした専門用語チェックや日本語の言葉遣いの問題はGitHub上でIssue管理して、RedPenを使っての自動チェックのCIを回したりしていました。例えば、専門用語についてはGoogleスプレッドシートに辞書を用意して対応が取れているか雑にスクリプトを書いてCIでチェックしていました。

f:id:sotetsuk:20180103000046p:plain

ただ後に書くようにこのチェックを自動でCI回すのはfalse-positiveの問題があり、なかなか一筋縄ではありませんでした。 例えば辞書は最初のうちは(専門)用語の種類を少し多めに登録してしまいましたが、箇所によって柔軟に訳したくなるような用語もアラートがなってしまい面倒でした。

7. 出版社の編集の方に校正をしてもらう

納品したら出版者の編集の方に校正をしてもらいました。 さすがプロということで、凄まじい速さで(ある程度)専門的な記述・一般的な記述含めて大量に直されました。 CIを回していたりある程度細かくやっていたつもりだったのですが、やはりプロに校正をお願いしないと品質として最低ラインを満たさないように思います。 "CSの定番教科書「Open Data Structures」を日本にも届けたい!"というプロジェクトでも、校正費用をクラウドファンディングしていたようです。(少額でも支援したかった。。。気付かず or 失念で叶わず)

編集の方で判断がつかない点はやり取りをしながらになりますが、基本的にこちらはそんなに大変ではなく、待っていたら完成・刊行になります。

教訓・反省(失敗・成功したなと思うこと、次にやるならどうするか)

上記のような方法・手順で無事刊行に至りましたが、その過程での反省は多かったです。 ここではその過程で得た教訓と反省、また逆にやってよかったことなどを記述していきます。

締切は厳守すべきだった

これは翻訳に限らないですし当たり前の話なのでアレなのですが、普通に生きていると、(ときに無意識に) 「質が最低ラインを超えるまで、必要なだけ時間をかける」 という方針で作業をしがちです。 これをやると何時までたっても納品できないので、 「締切をきちんと決めた上で、それまでに質を最大化する」 といった方針で作業すべきです。 結局、時間をかけたからといってさして良くなるわけでもないので、締切については動かない"決め"が必要で、それまでに最大限努力するようにした方がいいです。 後述の、「自動チェックを最初に初めて、いつでも最悪納品できるようにする」というのもこれと関連します。

ただこれはすごい普遍的な問題で、実行するのが非常に難しいというか、私は頭ではわかっていても正直すごく苦手ですし現に出来ていません(このブログ記事の投稿は2017年10月中を目指していましたが、結局2018年1月に投稿されました)。 そして、これは私だけでなく、苦手な人が世の中にはとても多いのではないかと思っています(皆さんは夏休みの宿題、ちゃんと終わっていましたか...?)。

正直どうしたらいいのか良くわかりません。ノウハウある方に教えて欲しいです。成功報酬として給料3ヶ月分くらい払っても知りたいです。

f:id:sotetsuk:20180103013957j:plainf:id:sotetsuk:20180103014006j:plain
締切を守るのはYoshikiにも難しい...
引用: https://twitter.com/jun_666_jun/status/947776153174994945

人数がいたのに並列で作業できなかったのは良くなかった

結局締め切り1年伸びてしまったのはこれも一つの要因かと思います。 輪講していた都合もありますが、どうしても直列で作業しがちでした。 ここはもっと並列にやることで効率的にできたかなと思っています。 また、直列で依存関係を作ってしまって作業することの弊害として、 上記のような「締切守るの難しい問題」からドミノ倒しのように作業が遅延していくという問題もあったような気がします。

結局一番進んだのは、少人数でその場で読み合わせ&修正

分担を振って締め切りまでにやってもらったり色々したのですが、皆さん忙しいので結局いつまで経っても終わらなかったりします。 結局少人数(3人くらい)でその場で読みながら気になった点を逐一修正していく、というミーティングを定期的に持つのが一番進みました。 今回は例えば、前田先生・小山先生と3人でスカイプをしつつ読み合わせ・修正するミーティングを何回もしていました。 年末年始など時間が取れるときに毎日スカイプでミーティングしながら進めたりしていました。 また、監訳を除く訳者陣で輪講している際にも、気になる訳についてはその場で対訳を考えたりしていました(ただこれは人数が多いとすごい疲労しました。。。)

色んな人に何となく修正させても訳(の質)が単調に改善して収束していくとは限らない(振動する)

やはり訳者の好みもあるので、違う担当者が確認・修正するのを繰り返すと訳(の質)が振動したり(あるいはデグレしたり)といったことがありました。 ただこれは担当者が悪いのではなく仕組みの問題で、翻訳が進むにつれて担当者の役割を細かく限定的にしたり、 masterマージ前に最終的に責任持つ人のレビューをきちんとやるといった工程が本来は必要だったかなと思います。

GitHubで管理したのは良かった

人数が多かったので、GitHubで原稿を管理したのは非常に良かったです。これは一定以上の人数で作業するならマストだと思います。 Overleaf等でもいいのですが、やはり修正者と修正意図はコミットログから確認したいところです。 科学技術書の出版社の方でもGitHubがデフォルトになるといいんではないかと思ったりはします(例えば技評さんはGitHubがデフォルトと聞いています)。 ただ一方、Gitに不慣れなメンバーがいると、Git自体の学習コストがそれなりに掛かるので、なかなか難しいところではあります。

masterマージ前に責任者がキチンとレビューすべきだった

当たり前なのですが、ここが少し疎かだったので、前述のようにデグレしたりといったことがあってしんどかったです。 時間がなくてもmasterへのマージはきちんとレビューしてからにした方が良いです。また、PRの粒度を適当な小ささで抑えるのも重要です(当たり前の一般論ですが)。

出版社への営業・版権を取るのは最初にやるべきだった

結果論ですがこれは翻訳を始める前にしてもよかったかなと思います。 まず大丈夫だと思いますが、版権ないと翻訳頑張っても結局出版できないので。。。

まず最初に原著のLaTeXファイルをもらうべきだった

前の項目とも関連しますが、これも大事です。 すごい当たり前な気もしますが、最初は頭が回ってませんでした。

原著を一文ぐらいずつコメントアウトして、その下に訳を書くのは良かった

原著との対応が見やすくよかったです。また専門用語訳などをスクリプトで自動でチェックする際にも役立ちました。

まず最初に専門用語辞書や簡単な規約をある程度固めて、スクリプトで自動でチェック出来るようにすべきだった

専門用語の辞書や簡単な規約は途中から導入したのですが、最初にすごく小さくでも仕組みを作ってCIの仕組みを作って、いつでも最悪納品できるようにしておいた方が良いと思いました。 辞書を作るのと自動でスクリプトである程度チェックするのは必須で、さもないと専門用語の訳を途中で変えたときに一々抜け漏れを逐一チェックしないといけません。

今回チェックしていた項目は色々ありましたが、例えば次のようなものをチェックしていました。 RedPenの機能を使ったものもあれば、自分で雑にスクリプトを書いたものもあります。

  • 不適切な記号の確認(、。など)
  • 正しい専門用語が使われているか(value function => 価値関数)
  • 間違った専門用語が文中で使われていないか(価値 数など)
  • 原著と(インライン)数式が一致しているか(意外と修正時にミスで意図しない数式になってることがあります)
  • 送り仮名
  • 一文中のカンマの数を一定以下に
  • 一文の長さを一定以下に

またこれに関しては、出版社の中の規約のようなものも事前に編集の方に聞くべきだったなと思いました。 (同じ社内でも詳しい人と詳しくない人がいると思うので、事前に詳しい人(例えば営業畑ではなく編集畑の方とか)を紹介してもらったりすべきでした)

自動チェックはfalse-positiveのトレードオフを考える必要がある

例えば今回、"system"の訳として、"システム"と訳す人と、"系"と訳す人が混在していました。 今回は基本的にシステムと訳すことにし、"system" => "システム"という対応を辞書に登録してチェックしていました。 ただ、"system"という単語は他の文脈で柔軟に訳したりしたくなるので、"system"に対し絶対"システム"と訳さなくてはいけない、というルールでチェックをすると、 スクリプトが誤検知を頻繁に起こします。 なのでここで取れる選択肢としては、

  1. "system" => "システム"の対応を辞書から外す
  2. 文章中のいくつかの"system"は例外として登録する

といったものが考えられます。"system"くらい訳が簡単そうなものなら1.を選択して辞書から外してもいい気はしますが、高い精度でのチェックを目指すなら、例外の登録を簡単にできるよう仕組みを作っておくことが大事です。 実際、こうした用途のツールであるRedPenには例外登録ができる機能があります: アノテーションによるエラーの抑制

また、どの程度のレベルのものなら辞書に登録するのか、自動でチェックをするのかといったしきい値を自分の中で設定しておく必要があるのではないかと思います。

LaTeX自動コンパイルは良かった

Overleafで編集しているときは勝手にコンパイルされますが、GitHubではCIでコンパイル => PDFアップロードを自動でするようにしていました。 色々やり方はある気はしますが、リリースにpdfを上げるようにしていました。

例えば、werckerでCIするなら wercker.yml は大体こんな感じです。ブランチ毎に最新のpdfがリリースにアップロードされます。

box: sotetsuk/platex
build:
  steps:
    - script:
        name: compile
        code: |-
          platex -interaction=nonstopmode -halt-on-error -shell-escape -kanji=utf8 main
          bibtex main
          platex -interaction=nonstopmode -halt-on-error -shell-escape -kanji=utf8 main
          platex -interaction=nonstopmode -halt-on-error -shell-escape -kanji=utf8 main
          dvipdfmx main
deploy:
  steps:
    - script:
        name: remove_old_assets
        code: |-
          export OLD_ASSET=`curl -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/<user>/<repo>/releases | jq ".[] | .assets | map(select(.name==\"${WERCKER_GIT_BRANCH}.pdf\") | .id) | .[]"`
          curl -H "Authorization: token ${GITHUB_TOKEN}" -X DELETE https://api.github.com/repos/<user>/<repo>releases/assets/$OLD_ASSET
    - github-upload-asset:
        token: $GITHUB_TOKEN
        file: main.pdf
        filename: ${WERCKER_GIT_BRANCH}.pdf
        release_id: <release_id>

boxとして次のdocker imageを利用してます。一応pdflatex版もあります。

大まかには次のような手順を踏みます。

  1. GitHubトークンを生成
  2. リリースを作る(リリースのIDも調べる)
  3. werckerでアプリケーション・パイプラインを作る。トークンを登録する。

総括

理系専門書を初めて翻訳して得た体験をもとにその教訓・反省などをまとめました。 見直してみると、当たり前というか、マヌケに聞こえる話が多いような気もしますが、意外と当たり前のことをきちんとやるのが難しいものだったりします。 今回の翻訳は薄い本だったので気軽な気持ちで始めましたが、思いの外大変だったので、 皆さんも技術書の翻訳などを始める前に上記のようなポイントを踏まえて始めてみてはいかがでしょうか。 誰かの参考になると嬉しいです。

速習強化学習を刊行しました

少し(というか結構)前になりますが、2017年9月に「速習 強化学習 ―基礎理論とアルゴリズム―」という本を刊行しましたので、簡単に紹介します(Twitter, FBでは告知しましたがブログがまだでした)。

f:id:sotetsuk:20180102223653p:plain

GoogleのAlphaGoによるプロ棋士打破は,人工知能がヒトを超えた学習を行った歴史的出来事として認識された。強化学習はここで重要な役割を果たしてているだけでなく,自動運転やロボット制御などの重要な分野への応用も知られ,いま世間の強い関心を集めている。その一方,日本語で強化学習を体系的に学べる教科書は多くはなく,代表的な教科書であるSutton and Barto (1998)とその訳書も出版から20年が経とうとしている。

 本書はトップ会議のチュートリアルで利用されたり,2010年の出版以降わずか数年で500弱の引用がされたりという事実からも窺えるように,入門書として広く読まれている良書である。本書の内容は動的計画法などの基本的かつ重要なアルゴリズムに始まり,比較的新しい手法も体系的に網羅しつつもコンパクトに自己完結している。原著の出版から7年あまり経つが,近年の発展は本書で掲載されたアルゴリズム・アイデアをその基礎においている。特に本書では,深層学習を利用した深層強化学習を含む最近の発展に,本書で紹介されたアルゴリズムがどのように使われているかを解説した訳者補遺を追加することで,本書と最先端の研究との橋渡しをしている。

どんな本?

この本は、Csaba Szepesvari著、"Algorithms for Reinforcement Learning"の訳書です。 原著は、強化学習の教科書として最も有名なSutton and Barto (1998) の次に有名なテキストだと思います。 対象読者は学部上級以上で、前提知識として微積・線形・確率統計に加え機械学習についても基本的な知識があるのが好ましいです。

非常に薄くコンパクトな本ですが、一番の特徴としては原著者自身が、

本書のゴールは読者に対してこの美しい分野(強化学習)を垣間見る機会を提供することである.

と言及している点から伺えるように、 強化学習の基礎理論について綺麗に体系的に説明している点 だと思います(原著は薄いですが、決してただ要点を掻い摘んだだけではありません)。 また、20近くのアルゴリズムについて擬似コードが付いているので、理解の助けになります。 さらに、深層強化学習に関する節も訳者補遺として追加しましたので、最近の話題についてもキャッチアップできる内容だと思います。

FAQ

ついでに、よく頂くコメント・疑問に簡単にお答えしておきます。

難しいんだけど...

確かに強化学習そのものの難易度を差し引いても少し難しめの本になります。挫折された方は他の資料で挑戦してみてから戻ってみても良いかもしれません。英語が問題なければ個人的にはD. Silverの講義ビデオと資料が理論・実例のバランスが良く、カバーしているトピックも豊富でオススメです。 和書では今のところ"Sutton and Bartoの和訳"と"これからの強化学習"などがあります(MLPシリーズも発刊予定です)。 ただ、難しめといっても、そうした記述は限定的なので、難しい部分は気にせず読み飛ばしていただければいいのではないかと個人的には思います。 そうすれば、上記の資料とそんなに難易度は変わらないはずです。

なぜ邦題が「速習」になったの?

薄いので、ですね。訳者陣でいくつか案を上げて出版社の方の意見も勘案して決まりました。 ちょっと難易度に関しては誤解を招きかねないタイトルだったかもしれません。 繰り返しになりますが対象読者は学部上級以上ですので、決して難易度が易しいわけではありません。

SNS上等での言及

勝手にではありますが、いくつか掲載させていただきます。

https://twitter.com/muripo_life/status/933161408199409665

www.qachi.info

s0sem0y.hatenablog.com

f:id:sotetsuk:20190510163412p:plain
https://speakerdeck.com/learn_learning3/qiang-hua-xue-xi-niokeruhao-qi-xin?slide=144

ICML'17における強化学習

この記事は2017年に書きかけのままだったブログ記事の供養です。 今2018年年始なので、NIPS参加報告も目立つ中、4ヶ月遅れくらいですが書きかけだったICML2017の参加録をひとまず投稿しておきます。

f:id:sotetsuk:20170909193237j:plain

8月上旬にシドニーで行われたICML2017に参加してきました 私自身は自然言語生成のワークショップで発表をしてきました。 強化学習系のセッションを中心に聞いていたのでどんな研究や発表が傾向として多かったかをまとめます。 このブログは内輪で参加報告をしたスライドを簡単にまとめたものなので、より詳細には発表スライドを参照ください。

docs.google.com

ホットトピック

まずは発表が多かったトピックについて簡単にまとめたいと思います。 また、強化学習一般の基本的な知識については仮定した上で説明します。

モデルベース深層強化学習

既存のDQNやA3Cといった有名な深層強化学習アルゴリズムは基本的に環境のモデルをブラックボックス的に扱うモデルフリーのアルゴリズムですが、今回はモデルベースの深層強化学習アルゴリズムがいくつか登場して目立っていた印象です。実用の観点からは推定したモデルを使ったプランニングが出来るようになると実用への大きな一歩になると感じます。元々環境のモデルが既知で推定する必要がない囲碁AIなどのドメインでの成功を見ると、次は(環境の)モデルを推定する必要がある問題で、これをうまく推定して活用しようという流れがあるのは自然な気がします。

f:id:sotetsuk:20180102210049p:plain

  • [1] Tutorial: Deep Reinforcement Learning, Decision Making, and Control
  • [2] The Predictron: End-To-End Learning and Planning
  • [3] Prediction and Control with Temporal Segment Models
  • [4] End-to-End Differentiable Adversarial Imitation Learning
  • [5] Combining Model-Based and Model-Free Updates for Trajectory-Centric Reinforcement Learning

ソフト最適

例えば、Q学習ではmaxをベルマン作用素に使って目標値R + γ max Q(s, a)に近づけるようQ関数を学習しますが、この作用素のmaxをlog-sum-expを使って定義する”ソフト(マックス)”な作用素を使ったQ学習 (Soft-Q) を提案する研究がいくつか登場しました[2, 3]。特に理論的な側面からの興味深さが際立ちます。まず、(1) 最適化したい期待収益にエントロピーも考慮すると、Soft-Qから定まる最適方策と方策勾配法で最適化して求まる最適方策が一致します[4,5]。これは価値ベース・方策ベースの手法の統一的な見方が出来るやもという点でとても面白いです。 また、(2) この作用素は縮小写像なので他の強化学習アルゴリズムと同様バナッハの不動点定理を使い収束性を示せます [3]。そして、(3) ハイパーパラメータの極限を取ることでmax, meanの作用素を復元できます[3, 4]。これによってQ学習やSARSAで使われる作用素を復元できます。この話題に関しては、似たようなアイディアの研究が同時期にたくさん出ていて、正直貢献の細かい違いをきちんと把握できていないです。

[4], [5]はICML'17での発表ではありませんが、いくつかの発表内で言及がありました。

階層性(オプション)

Montezuma’s Revengeのように報酬がスパースな問題はいくつかのサブタスクのようなものに分割しないと解くのが難しいですが、この分割を自動で学習しようという研究がいくつかありました。強化学習の文脈では、より階層が上の方策(のようなもの)をオプションと呼ぶことがあります。基本的には報酬に依存しない情報だけから何らかの形で(当然ヒトの事前知識も使わず)中間的なサブゴールを獲得しにかかるアプローチになります。

f:id:sotetsuk:20180102215817p:plain

(報酬情報なしでの)系統立った探索

Montezuma’s Revengeのような問題ではどうようにどう空間を系統立てて探索するかが重要になります。よくある探索のアプローチは「不確かなときは楽観的に」の原則に従うものですが、極めて報酬がスパースで状態空間が膨大な問題設定では実用性に乏しいです。アプローチとしては、(疑似)カウント系のアプローチと、予測の確信度を使う系統のアプローチがあるそうです(ただどちらもある状態がどの程度起こりそうだと予測しているかを推定する形になり本質的には近いような気もします)。[1]では報酬を使わずにマリオのプレイができてしまうというのは中々インパクトがあります。

f:id:sotetsuk:20180102205805p:plain

  • [1] Curiosity-driven Exploration by Self-supervised Prediction
  • [2] Count-Based Exploration with Neural Density Models

一貫学習 (end-to-end learning)

これはテーマというよりは、ニューラル全盛の時代である今、モジュール全体を繋げて微分可能に設計するのは一つの基本戦略と言っても良いのかもしれません。言うまでもなくこうして全てのモジュールを全部一貫して微分可能にして誤差逆伝搬法で全体を最適化する手法はいくつか散見されました。RLはナイーブに考えると比較的途中で切断されやすい気もするので一層重要なのかもしれません。

f:id:sotetsuk:20180102210151p:plain

  • [1] End-to-End Differentiable Adversarial Imitation Learning
  • [2] The Predictron: End-To-End Learning and Planning
  • [3] FeUdal Networks for Hierarchical Reinforcement Learning
  • [4] Zero-Shot Task Generalization with Multi-Task Deep Reinforcement Learning

学習時と異なる環境への汎化(transfer/zero-shot)

シミュレータで学習して実機を動かしたいときなど、(似てはいるが)異なるMDPへの汎化を獲得しなければいけない状況はままあるので、こうした場合について、学習時に適切な外乱を加えて正則化をかけたり[1]、異なるMDPへの汎化を学習するモジュールをend-to-endに組み込んで一緒に学習するといったアプローチがありました[2,3]。

f:id:sotetsuk:20180102215930p:plain

実用的な探索(安全・公平)

現実社会に強化学習アルゴリズムをデプロイする場合には、学習中の挙動に制限を書けたい場合があります。例えば、(1) 安全に探索して欲しい[3](e.g., 壁にぶつかって欲しくない)(2) 公平に探索してほしい[2](e.g., 白人ばかり不公平に優先するのはやめて欲しい)といった場合が考えられます。こうした意味で探索に何らかの形で制約をかけたりするアルゴリズムがいくつかありました。

ヒトによる教示

ヒトによる教示を学習に使いやすいようにしているような研究がいくつかありました。(階層的なゴール設定が必要な場合など)学習が難しい環境では無駄にアルゴリズムの設計を頑張るよりヒトと協調して動くアルゴリズムを考えたほうが実用的かもしれません。

f:id:sotetsuk:20180102213832p:plain

方策オフ型学習でのバイアス・バリアンス

これは別に昔からある話題ですが、今回もこういう系の話題でセッション一つ分くらいはありました。方策オフ型での学習では勾配や価値関数の推定でバイアスが生じます。これを修正するために重点サンプリング (IS) が行われる場合が多いですが、(強化学習の場合はとくに)分散が大きくなってしまい学習が安定しません。ISよりもバイアスは出るがバリアンスは小さい推定量を提案する研究など、関連研究は昔からたくさんあり、昨年も例えばDR (doubly robust) 推定量を使った研究などがいくつかありましたが、今年もこうした研究は盛んに続いている印象です。

  • [1] Data-Efficient Policy Evaluation Through Behavior Policy Search
  • [2] Stochastic Variance Reduction Methods for Policy Evaluation
  • [3] Optimal and Adaptive Off-policy Evaluation in Contextual Bandits
  • [4] Consistent On-Line Off-Policy Evaluation

個人的に面白かった発表・トピック5選

チュートリアル

良かったセッションは色々あったのですが、初日のS. Levine氏らによるチュートリアル"Deep Reinforcement Learning, Decision Making, and Control"は非常に良かったので興味がある方は是非リンクからスライド眺めてみると良いのではないかと思います。 前半の基本的なところは方策勾配系と連続行動空間にとくに詳しくて分かりやすく、後半の発展的な話はソフト最適の話や、逆強化学習はGANとの関係にも触れています。 最後の方のモデルベースは正直知らない話題が多かったですが勉強になりました。

ソフト最適

内容については上で既に触れましたが、個人的にソフト最適の話は好きです。

カテゴリカルDQN

通常のベルマン方程式は期待値だけ考えるが、マルチモーダルなときなどを考えると良くないので分布で考えたいということで、DQNアーキテクチャに組み込める形でQ関数の分布を推定できる手法を提案しました。

f:id:sotetsuk:20180102214152p:plain

ベータ方策

連続行動空間の確率的方策では昔からガウス方策がよく使われます。ただ現実には物理的に取りうる値にしきい値があり、これによってバイアスがでる場合があります。これをベータ分布を使ってこれを解決します。

f:id:sotetsuk:20180102210812p:plain

  • [1] Improving Stochastic Policy Gradients in Continuous Control with Deep Reinforcement Learning using the Beta Distribution

PVFによるオプションの発見

ちょっと正直まだ良く理解できてないですが、Proto-value function (PVF) というものを利用してオプションを見つけるという研究が面白かったです。PVFは価値関数を線形和で分解したもので、結局 φ(s') - φ(s) をSVDする感じになるっぽいです。Montezuma’s Revengeで実験もして獲得されたオプションが重要なオブジェクトに対応していることを確認しています。

f:id:sotetsuk:20180102214656p:plain

総括

深層強化学習も研究の主眼がだんだんと難しい(が実用化に資する)ものに移ってきた感じがします(1. -> 2. -> 3.)。モデルベースの深層強化学習はドメインによってはかなり困難なタスクのように見えますが、実現すればまた一つブレイクスルーになる可能性がある分野だと思うので今後の発展が楽しみです。

  1. Model-free value-based , 離散行動空間 (e.g., DQN)
  2. Model-free policy-based, 連続行動空間 (e.g., A3C, TRPO)
  3. Model-based, 連続行動空間 (e.g., Predictron)

また論文の見せ方も強化学習は派手なものが多く、ビデオがついてるものはやはり見栄えがいいなと感じました。arXiv, blog, YouTube, GitHubの4点セットを付けないと中々注目を集めにくくなっているのかもしれません。

[PR] 速習 強化学習

Csaba Szepesvari著、"Algorithms for Reinforcement Learning"の訳書「速習 強化学習 ―基礎理論とアルゴリズム―」が共立出版から2017年9月末に発売になりました。 コンパクトな本ですが強化学習の理論を体系的に学ぶことができます。 深層強化学習に関する節も訳者補遺としてございますので是非お手にとっていただければと思います。

f:id:sotetsuk:20180102221423p:plain:w300

速習 強化学習 ―基礎理論とアルゴリズム― / Csaba Szepesvári 著 小山田 創哲 訳者代表・編集 前田 新一 小山 雅典 監訳 池田 春之介 大渡 勝己 芝 慎太朗 関根 嵩之 高山 晃一 田中 一樹 西村 直樹 藤田 康博 望月 駿一 訳 | 共立出版

GoogleのAlphaGoによるプロ棋士打破は,人工知能がヒトを超えた学習を行った歴史的出来事として認識された。強化学習はここで重要な役割を果たしてているだけでなく,自動運転やロボット制御などの重要な分野への応用も知られ,いま世間の強い関心を集めている。その一方,日本語で強化学習を体系的に学べる教科書は多くはなく,代表的な教科書であるSutton and Barto (1998)とその訳書も出版から20年が経とうとしている。 本書はトップ会議のチュートリアルで利用されたり,2010年の出版以降わずか数年で500弱の引用がされたりという事実からも窺えるように,入門書として広く読まれている良書である。本書の内容は動的計画法などの基本的かつ重要なアルゴリズムに始まり,比較的新しい手法も体系的に網羅しつつもコンパクトに自己完結している。原著の出版から7年あまり経つが,近年の発展は本書で掲載されたアルゴリズム・アイデアをその基礎においている。特に本書では,深層学習を利用した深層強化学習を含む最近の発展に,本書で紹介されたアルゴリズムがどのように使われているかを解説した訳者補遺を追加することで,本書と最先端の研究との橋渡しをしている。

ソウルでAlphaGo Movieを観てきた

f:id:sotetsuk:20171203172334p:plain

AlphaGoのドキュメンタリ映画、AlphaGo Movieの予告動画がカッコよすぎたので、週末にわざわざ韓国に出向き、研究室時代の韓国人の友人と一緒にソウルで観てきました。アジア圏での上映はこれが台湾に次いで二カ国目だと思います。

 

少なくともこの予告動画(Trailer)は一見の価値があるカッコよさです。

 

www.youtube.com

www.alphagomovie.com

 

ちなみに映画を見終えた数時間後に now available for download! とアナウンスがありました。控えめに言って死にたい。。。

 

内容

個人的にはとても面白かったです。

予告を見ればわかりますが、内容としてはAlphaGoと、最強の囲碁棋士と目されるLee Sedolの人類の威信をかけた五番勝負が中心です。囲碁ヨーロッパチャンピオンで、最初にAlphaGoに敗北するプロ棋士Fan Huiが、物語のある種の語り手となって話が進んでいきます。人物としては、話の中で一番注目が当たっていたのは当然Lee Sedol、その次がDeepMind CEOのDemis Hassabisという構成で、AlphaGoプロジェクトのトップのDavid Silverはそこまでフィーチャーされているという印象は受けませんでした(もっとフィーチャーされてもいいのではないかと思いました)。また当たり前ですが、全体としてとくに事前知識がなくても楽しめる作品になっていて、技術的な内容に関しても特に踏み込んだ話はありません。ただ、論文を読むだけではわからない当時の雰囲気を感じられるという点で一見の価値ある作品だと思います。

ちなみに日曜ですがガラガラでした。

個人的に印象に残った点

以下は多少ネタバレになるかもしれません。 

個人的に印象に残ったのは、やはり戦いが進むにつれ変わっていくLee Sedolの心境と、その表情でしょうか。試合前には静かながらも確固たる自信を覗かせていたLee Sedolですが、第一局目の終盤には少しあっけにとられ、投了時にはいささか認め難いといった表情を見せます。そして第二局目では、途中席を立ちタバコを吸って気持ちを整え戻ってきてところで、(一見人間には悪手にしか見えないながらも)芸術的とも言われたAlphaGoの妙手を突きつけられ、困惑を隠しきれません。

また第四局目、Lee Sedolが奇跡的な一手を放ち勝ち星をもぎ取るわけですが、その一手について聞かれたときの「自分にはそこしか考えられなかった」という趣旨の発言がとても印象深かったです。AlphaGoはそこに打たれる確率は0.007%程度と予測していたわけですが、Lee Sedolにはそこしか考えられなかったというのは少し面白い話です。

あと個人的にはもう少しAlphaGo製作の過程が観れると嬉しかったかなという印象ですが、冷静に考えるとある程度完成してからカメラを入れ始めたのでしょうから、しょうがないのかもしれません。それでも、AlphaGoチームがメンバー間で密に連携を取ってプロジェクトを進めていたんだろうという雰囲気がなんとなく伝わってきました。メンバー個々人ももちろん天才といって過言でない人々なのでしょうが、そうしたメンバーが個人技だけでなく、それなりの人数で一丸となってこうした大きな成果を出すというのは、やはり尋常ならざる偉業だと感じました。あとやたら筋肉質なメンバーが目立っていた印象で、僕も筋トレしようかなと少しだけ思いました(違

また改めて、作ったエンジニアにとってはただプログラム通りに動いて学習したモデルに過ぎないわけですが、囲碁棋士からみるとAlphaGoには知性があり、芸術的な一手を指すように見える(ときがあった)というのも面白いと感じました。正直僕はまだニューラルネットワークに知性を感じたり、あるいは例えば人格を持っているかのように感じたことはないですが、もしかすると、将来そういったニューラルネットワークが見られるかもしれないと妄想し、楽しみに感じました。

 

以上ポエムでした。ダウンロード版が観られるということで、皆さんも是非ご覧なってはいかがでしょうか。世間のAI・機械学習人材がNIPSで忙しい中、二年ぶり二回目に書くブログがポエム旅行記というのはなんとも情けない感じもしますが、やむを得ません。

ちなみにチーズダッカルビ美味しかったです!!

 

f:id:sotetsuk:20171203171410j:plain

チーズダッカルビ

 

Adversarial exampleについて

この記事はMachine Learning Advent Calendar 2015 - Qiitaの16日目です。

今回はDeep learningに関連したトピックであるAdversarial exampleについて簡単にまとめたいと思います(宣言していたものと違いますが...*1)。SNSなどを通じて情報が入ってくることは比較的多い話題だとは思うのですが、日本語でまとめた記事はあまりないかなと思ったので、誰かの役に立ってくれると嬉しいです。

 

これまでの経緯として、Adversarial exampleはSzegedy et al. (2014)ではじめて提案され、arXivに掲載された2013年12月から現在に至るまで2年間で100を超える引用数があります。ICLRなどを中心とした会議(というかarXiv)で研究・議論が進んでいて、今夏のDeep Learning Summer Schoolでは、GoogleのIan Goodfellowがこのトピックについて講義を行っています(slide)。

 

Adversarial exampleとは

Adversarialという単語を調べてみると

1. 反対の 2. 敵対する、対立する といった意味が出てきます。

 

Szegedy et al. (2014)では、学習済ニューラルネットワークを"欺く"ようにデータセットのサンプルから造られた人工的なサンプルのことを、adversarial exampleと呼んでいます。学習済ニュラルネットワークに対し、正しいクラスAだと識別されるサンプル xを用意します。これに対し、少しだけノイズ r \|r\|_{2}は十分小)を加えた \tilde{x} = x+rが、ニューラルネットワークを欺く(誤ったクラスだと識別する)ように最適化問題を解いて rを求めます。すると、(たとえば画像認識なら)人間の目には x + r xと同じようにクラスAにしか見えないのに、ニューラルネットワークは違うクラスのサンプルだと(強い確信度で)誤ってしまうサンプルが作れます。これは、もしニューラルネットワークを欺こうとする敵対者がいれば、そうしたサンプルを作れてしまうことになります。この問題は、実社会での応用を見据えれば極めて重要になってくる可能性があります。具体例としてGoodfellow et al. (2015)から引用してきた画像を示します(この rの構成方法は最適化問題を解くよりシンプルなものです): 

 

f:id:sotetsuk:20151216061247p:plain

 

パンダだと正しく識別していたものが、ノイズを加えられることで、人間の目にはパンダにしか見えないのにも関わらず、誤って識別されていることがわかります。Deep learningはご存知のようにImageNetなどの画像認識タスクで高い識別性能、汎化性能を示しているわけですが、このニューラルネットワークの挙動は、自然画像データのように空間の中で連続性が担保されていて欲しい( x \tilde{x} = x+r rが小さければ似たもの、同じクラスのものであって欲しい)データに対して適切でないという印象を受けます。

 

似たような研究として、Nguyen et al. (2015)は人間の目には全く意味を成さない画像(サンプル)なのにも関わらず、高い識別性能を示すDeep neural networkが、ある特定のクラスの画像だと強く思い込む画像を進化的アルゴリズムを使って構成しています(fooling images): 

 

f:id:sotetsuk:20151216171249p:plain 

  

なんでこんなことが起こるの?

直感的にはニューラルネットワーク非線形性から説明がされそうな気がしますが、Goodfellow et al. (2015)では、入力データ空間が高次元であれば(例え識別器が線形であっても)adversarial exampleを構成するのに十分である、という説明をしています。

まずそもそも、Goodfellow et al. (2015)によればadversarial exampleは線形な識別器でも実際に起こります。データ空間の高次元性による説明は線形識別器でもadversarial exampleが造れることに対する直感的な説明を与えます: 

学習済識別器にサンプルを入力して出力を得る際、ニューラルネットワークやロジスティック回帰をはじめとする多くの識別器では、その出力は次のような重みと入力の内積に依存します: 

$$\begin{equation}\displaystyle w^{\mathrm{T}}\tilde{x} = w^{\mathrm{T}}x + w^{\mathrm{T}}r\end{equation}$$

 w^{\mathrm{T}}rがどのように出力に影響を与えるのか考えます。ここで、 r = \varepsilon \cdot sign(w)とします。これは \|r\|_{\infty} = \varepsilonかつ、内積計算時に各要素の積が正の値として加算されていくようにしています。すると、 w^{\mathrm{T}}r \varepsilon \cdot n \cdot mとかけます(但し、 nはデータ空間の次元数、 m wの各要素の大きさの平均)。これは nに対し線形なので、少なくともこのように rを構成することで、 w^{\mathrm{T}}r = w^{\mathrm{T}}\tilde{x} - w^{\mathrm{T}}xを大きくしていくことが出来ます。これは、線形な識別器でadversarial exampleが構成できる直感的な説明になっています。近年提案されているDeep learningのモデルも(部分)線形な活性化関数を用いていることを考えれば、一つの仮説として説明力のあるもののように感じます。 

Adversarial training

Goodfellow et al. (2015)では、adversarial exampleを正則化に使うというアイディアを提案しています。最小化するコスト関数 J(\theta, x)に次のようにして正則化項を加えます: 

$$\begin{equation}\displaystyle \tilde{J}(\theta, x) = \alpha J(\theta, x) + (1-\alpha)J(\theta, \tilde{x})\end{equation}$$

Goodfellow et al. (2015)では、これによってMNISTでテスト誤差の改善を報告しています。

 

これに着想を受け、2015年末時点で既にいくつかの進展があり、PFIの岡野原さんがTwitterで紹介されていたので、そのコメントと共に紹介します。

 

Miyato et al. (2015)はコスト関数ではなくデータ空間に直接滑らかさを定義することによって、ラベル情報なしでadversarial trainingする手法を提案しました(VAT;Virtual Adversarial Training)。ラベル情報なしで学習できるためsemi-supervised learningのタスクに応用でき、arXiv掲載時点ではMNISTにおけるsemi-supervisedタスクのstate-of-the-artでした。

 

Nøkland (2015)は、よりシンプルな方法でコスト関数の勾配を変形し正則化する学習法を提案しました。

  

まとめ・感想

Adversarial exampleについて、文献を上げながら簡単に経緯と概要を説明しました。少し内容の薄い記事になってしまった感もありますが、最後に参考文献とリンクを上げているので、興味があればそちらを見てみて下さい。

参考文献

  • Szegedy et al., Intriguing properties of neural networks. (2014) ICLR. (arXiv)
  • Goodfellow "Adversarial example." (2015) Deep Learning Summer School. (slide)
  • Nguyen et al. "Deep Neural Networks Are Easily Fooled: High Confidence Predictions for Unrecognizable Images." (2015) CVPR. (arXiv)
  • Goodfellow et al. "Explaining and Harnessing Adversarial Examples." (2015) ICLR. (arXiv)
  • Miyato et al. "Distributional smoothing by virtual adversarial examples." (2015) arXiv. (arXiv)
  • Nøkland "Improving Back-Propagation by Adding an Adversarial Gradient." (2015) arXiv. (arXiv)

本文では触れなかった関連する文献やブログもあげておきます: 

*1:もともとはポアソン過程やその亜種を使ったWeb上のユーザ行動のモデリング事例について書く予定だったのですが、工数が存在しませんでした...