言語生成の強化学習をやっていく(手法紹介 Actor-Critic編①)

この記事は強化学習苦手の会 Advent Calendar 2020の5日目の記事です。サクサク行きましょう。


追記 2020.12.16
Actor-Criticの式が思った通りに伝わらなさそうなので、以下のように書き直しました。

(修正前)$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, S_{t} \right) \left( r(\hat{Y}) - V_{\Psi}\left( S_{t} \right) \right)}$
(修正後)$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, S_{t} \right) \left( Q(S_{t}, y) - V_{\Psi}\left( S_{t} \right) \right)}$

ここではひとまず、$V_{\Psi}$をCriticのモデルにしてQ値を求めている文献[167] Learning to Decode for Future Success (ArXiv)に沿って定式化しました。

しかし、Actor-Criticは色々な設定があるようでして、$V_{\Psi}$でなくて$Q_{\Psi}(s,a)$で定式化していたり、ひとつのモデルでVとQを両方予測別々に予測してたり、個別に別の構造・パラメータでモデル化してたりしているようです。

例えば、 文献[39] An Actor-Critic Algorithm for Sequence Prediction (ICLR2017)DQNのように、各行動に対するQ値を出力するCriticです。アドバンテージ関数$A(s,a)$の最大化の問題ではなくQ値の最大化の問題として定式化しているため、状態価値関数$V$は出てきません。

ちなみに、上の(修正前)の方は、CriticをREINFORCEのbaselineとして使っているということで、文献[39]では”REINFORCE-Critic”と呼ばれていました。論文の報告によると、機械翻訳タスクでのBLEUはActor-Criticと遜色ないとのことでした。(収束はActor-Criticが数倍早い模様です)

追記 2020.12.16
「Memory bufferによるoff-policy化」を「Memory bufferによるCriticの学習の工夫」と変更しました。off-policy化という話はサーベイ論文で言われている内容をまとめたものでしたが、Criticのみのoff-policy化ということもあり、on-policy, off-policyの境界は私には闇が深そうなので触れるのをやめました・・・伝えたいのはMemory bufferに突っ込んで時系列情報の相関を無くすことが言えれば十分なので。

(追記分おわり)


目次

免責事項:載せている式は論文からの引用ではなく、自分の理解で書いたものが含まれますので、サーベイ論文の紹介と言っても論文の内容をそのまま写しているわけではありません。気になるところがあれば原論文をご確認することを勧めます。

言語生成の強化学習 弐ノ型 「Actor-Critic」

さて、前回の記事でREINFORCEによる言語生成を紹介しました。REINFORCEの問題点は、サンプリングを行うことにより近似する行動価値の分散が大きくなりがちで、学習に悪影響を及ぼすことです。REINFORCEの派生手法であるSelf-Criticは、生成系列にgreedy searchを用いてベースラインとすることでサンプルの分散の影響を減らそうとしていました。

Actor-Criticでは、新たにCriticと呼ばれるモデルを導入として、ベースライン(現在の状態における平均的な価値、つまり状態価値)を直接推定します。

方策$\pi$におけるAdvantarge関数(行動価値関数から状態価値関数を引いたもの)を以下のように定めると、

$A\left(s_{t}, a_{t}\right)=Q \left(s_{t}, a_{t}\right)-V\left(s_{t}\right)= \ r_{t}+\gamma \mathbb{E}_{s_{t^{\prime}} \sim \pi\left(s_{t^{\prime}} \mid s_{t}\right)}\left[V\left(s_{t^{\prime}}\right)\right]-V\left(s_{t}\right)$

と書けます。$V\left(s_{t}\right)$がこのときの新しいベースラインになるCriticで、学習パラメータを$\Psi$として$V_{\Psi}\left(s_{t}\right)$と書くと、言語生成の強化学習におけるActor-Criticの式は、前回のREINFORCEと形式を合わせて以下のようになります。

REINFORCE

$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, S_{t} \right) \left( r(\hat{Y}) - r_b \right)}$

Actor-Critic

$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, S_{t} \right) \left( Q(S_{t}, y) - V_{\Psi}\left( S_{t} \right) \right)}$

(ただし、$S_{t}=(s_{t+1}, c_{t})$とした)


(ちなみに)論文中ではこのように載ってます。
f:id:snowman_88888:20201204223039p:plain
ここでいくつか疑問があります。

  • $c_{t-1}$は文脈ベクトルで、状態の中に入ると思います(でも論文だと入ってなくて$A_{\Psi}\left(s_{t}, y_{t}\right)$になってるのが謎)

  • 推論時に$A_{\Psi}$を使っているが、行動価値関数に対応する情報は保持してないからこれできなくない?

以上です。これについては後日確認して追記します。(力が尽きてる・・・)


さて、Criticは新しく追加されたモデルなので、学習する必要があります。これには状態$S^{(i)}$と、その状態$S^{(i)}$からエピソード終了までの累積報酬$v^{(i)}$の組$\left(S^{(i)}, v^{(i)} \right)$による教師あり学習(TD学習)で学習することができます。($i$は組のサンプル番号)

$\mathcal{L}(\Psi)=\frac{1}{2} \sum_{i} \left|V_{\Psi}\left(S^{(i)} \right)-v^{(i)}\right|^{2}$

言語生成の強化学習では、(おそらく)即時報酬が無い、かつ時間による価値の割引も無い設定です。よって、エピソードの状態系列が$S_1, S_2, \ldots, S_T$、その時の報酬が$r(\hat{Y})$だとすると、以下のような感じになりそうです。

$(S^{(1)}, v^{(1)}) = (S_1, r(\hat{Y}))$,
$(S^{(2)}, v^{(2)}) = (S_2, r(\hat{Y}))$,
$\ldots$,
$(S^{(T)}, v^{(T)}) = (S_T, r(\hat{Y}))$

Memory bufferによるCriticの学習の工夫

上のように作成されるサンプル$\left(S^{(i)}, v^{(i)} \right)$は、方策(Actor model)に従い時々刻々と生成された系列です。

時々刻々と生成された系列を利用して得られたサンプル同士は相関を持っていてCriticの学習に悪影響を与える問題があります。

この相関を消すために、memory bufferを用意して、得られたサンプルをこのbufferに突っ込んでいき、学習時はbufferからランダムに抽出したサンプルを利用するという工夫がよく行われるようです。

Experience replayの名前でよく知られた手法かなと思います。

Actor-Criticの強み

REINFORCEと比べると、ベースラインを推定することで系列のサンプリングにより近似的に求める行動価値の分散を小さくできる点が優れているのかと思います。この点のモチベーションはSelf-Criticと同じですが、差がどのようになるかは気になるところです。

他にもMLP強化学習青本)だと、次のような利点が紹介されています。

クリティックとアクターが分かれていることで、さまざまな関数近似器を方策モデルに用いることができる

確率的方策をそのランダム性も含めて学習できる


今週は学会でかなり消耗したので、これくらいでギブアップです。
次回はActor-Criticを用いたDeep Q-learningを使う話を書こうかと思います。
実はサーベイ論文の後ろの方にももう少しActor-Criticの話があったので、後日追記するかもしれません(ということで、タイトルに①をつけておきました)

言語生成の強化学習をやっていく(手法紹介 REINFORCE編)

この記事は強化学習苦手の会 Advent Calendar 2020の3日目の記事です。

免責事項:載せている式は論文からの引用ではなく、自分の理解で書いたものが含まれますので、サーベイ論文の紹介と言っても論文の内容をそのまま写しているわけではありません。気になるところがあれば原論文をご確認することを勧めます。

2020.12.04 追記

REINFORCEの式が間違ってたので修正しました。
(誤)$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{T} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, s_{t+1}, c_{t}\right) \left( r(\hat{Y}) - r_b \right)}$
(正)$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, s_{t+1}, c_{t}\right) \left( r(\hat{Y}) - r_b \right)}$

はじめに

こんにちは、品川です。
私は、強化学習苦手の会のもくもく会ニューラルネットによる言語生成の強化学習を試してみようとしています。
理由は、私自身が興味あるというのと、image-captioningなどの研究領域で、強化学習を使ってfine-tuningするのが標準的になってきたので、中身を深く理解しておく必要があると考えたためです。

最近の強化学習自体には色々な教科書や良さげな資料が出てきていますが、言語生成においては意外とチュートリアル的な資料をあまり目にしていませんでした(てっきり出てくると思っていたのですが)ただ、一つサーベイ論文を見つけて読んでみたら結構良かったので、今回はその論文で学んだことを紹介しようと思います。

サーベイ論文の概要

今回紹介するサーベイ論文のタイトルは"Deep Reinforcement Learning for Sequence-to-Sequence Models"です。 arxiv.org

2019年の4月にArXivで公開された論文です。言語生成に用いるモデルとしてはLSTMのようなRNNベースの系列生成モデルを想定していますが、現在徐々に勢力を広げつつあるTransformerベースのモデルでも自己回帰なモデルは基本的な考え方が同じはずなので応用可能と思います。

このサーベイ論文の面白い所は、説明が方策勾配法→Actor Critic→Q-learningになっている点です。多くの書籍や資料ではQ-learning→方策勾配法→Actor Criticというのが多い印象でしたので、方策勾配法から入る説明は初めて見ましたが、こちらの説明の方が個人的にはすっと入ってくる気がしています。

また、サーベイ論文として、image-captioningだけでなく様々な分野の言語生成タスク、評価指標が網羅されています。著者はTensorflowで各種のアルゴリズムの再現実装も行っているようで、訓練時間についても比較言及している点が面白かったです。(Actor-Criticが良さそうという結論でした;後述します)

一つ注意点は、Double Deep Q-LeanringとDDQNの説明が紛らわしいという点でしょうか。式(30)は2つあるQの前後がおそらく逆であるべきと思われますので、この点だけ注意が必要かと思います。(後述します)

言語生成モデルのおさらい

まず、ニューラルネットによる言語生成について簡単におさらいしたいと思います。

言語生成モデルは、$w_i$を文のi番目のトークン(生成時に扱う単位、単語・文字・サブワードなど)とすると、$p(w_1, w_2, w_3, \ldots, w_N, C) = p(C)\Pi_{t=1}^{N}{p(w_t | w_{t-1}, w_{t-2}, \ldots, w_1, C)}$のモデルを学習することを目指します。ここで$C$は生成条件で、例えばimage-captioningなら画像、機械翻訳なら原言語文が該当します。

本記事では、サーベイ論文の内容に沿って、ニューラル言語モデルとしてRNNを想定することにします。 RNNを使う場合、トークンを予測する確率分布$p(w_t | w_{t-1}, w_{t-2}, \ldots, w_1, C)$は、隠れ層$h_t$を用いて以下のように表現されます。

$p(w_t | w_{t-1}, w_{t-2}, \ldots, w_1, C) = p_{\theta}\left(y_{t} \mid \hat{y}_{t-1}, h_{t}, c_{t-1}\right)$

ここで、生成済みの系列情報$w_{t-1}, w_{t-2}, \ldots, w_1$と生成条件$C$は文脈ベクトル$c_{t-1}$とRNNの隠れ層$h_t$によって表現されます。 文脈ベクトル$c_{t-1}$は、主に生成条件のencoderからの特徴量(attention vectorなどの情報も含む)だと考えて良いです。
$\hat{y}_{t-1}$は、前の時刻に生成したトークンが対応しています。$\theta$はモデルの学習可能なパラメータです。

言語生成における強化学習 (前提知識)

言語生成における強化学習では、この生成済みの系列から次のトークンを予測する確率分布$p_{\theta}$が方策$\pi_{\theta}(a|s)$にあたります。つまり、言語生成における強化学習のaction $a$は「語彙の中から次に生成するトークンを選ぶ操作」、状態 $s$は「隠れ層や文脈情報、前の時刻のトークンによる入力ベクトル」ということになります。

エピソード

1エピソードは、文頭から文末のトークンを生成するまでが該当します。
文を生成しきって1エピソードが終了した時点で教師データである参照文との近さをBLEUやCIDERなどの文の近さの評価尺度で評価するため、通常遅延報酬のみで即時報酬が無いのが特徴のようです。また、強化学習における割引率を小さくすると短い文が生成しやすくなると考えられることから、割引率は1.0か、同程度に高いものが選ばれていると想像します。(私見では、image-captioningとかだと割引率についての言及はないことが多い印象です)

報酬

強化学習の報酬には、言語生成の評価に用いられるBLEUやCIDErなどを使うことができます。これらは生成文と参照文の間の近さを測る評価指標です。 強化学習を言語生成に用いる最大のモチベーションは、これらの微分不可能な評価指標を報酬として直接最適化できる点にあります。

学習における立ち位置

言語生成における強化学習の役割はファインチューニングであるという認識で間違っていないと思います。
多くの手法では、最初にクロスエントロピーでTeacher forcingで学習してからある程度言語モデルを学習させた後に強化学習を適用するケースが多いようです[要出典]。
私見としては、actionの数が多くて探索空間が広いため、効率よく学習するためには、ある程度言語モデルを作りこんでおくことで選択肢を減らす必要があるのだと思います。

言語生成の強化学習 壱ノ型 「REINFORCE(方策勾配法による最適化)」

さて、さきほど方策がニューラルネットになっているという話をしました。ならば、勾配降下法で最適化せねば不作法というもの・・・ということで、この方策を直接最適化する方法である方策勾配法から紹介します。

実際、言語生成系で強化学習を使っている論文で最も頻繁に目にするのは、おそらくREINFORCE(またはモンテカルロ方策勾配法)だと思われます。 REINFORCEは、方策勾配法の最も単純な手法と言われています[MLP強化学習(青本), P.186]。 おそらく、手軽に追加できるという点が利点なのかなと思います。最近は「reward is hogehoge~」とだけ書いてる論文もたまに見ますが、これはだいたいREINFOECEを使っているとみて良いでしょう(たぶん)

ちなみに、REINFORCEは略称で、正式には

REward Increment = Nonnegative Factor times Offset Reinforcement times Characteristic Eligibility(報酬増大=非負係数×オフセット強化×特性エリジビリティ)

とのことです[MLP強化学習(青本), P.186]。

まず目的関数を書いてみます。強化学習の目的は累積報酬を最大化することでした。つまり、目的関数は以下のように書くことができます。

$\mathcal{L}_{\theta}=-\mathbb{E}_{\hat{y}_{1}, \cdots, \hat{y}_{T} \sim \pi_{\theta}\left(\hat{y}_{1}, \cdots, \hat{y}_{T}\right)}\left[r\left(\hat{y}_{1}, \cdots, \hat{y}_{T}\right)\right]$

ここで、$r$は文頭から文末まで一文を生成しきった1エピソードに対しての(遅延)報酬となっています。$\hat{Y} = (y_{1}, \cdots, y_{\hat{T}})$を生成文、$Y_i = (y_{i, 1}, \cdots, y_{i, T_i})$ (ただし、$i=1,2,\ldots$)を参照文とすると、適当な評価指標(例えばCIDEr)を用いて、以下のような意味合いとなります。

$\mathcal{L}_{\theta}=-\mathbb{E}_{ \hat{Y} \sim \pi_{\theta}} \left[r (\hat{Y}) \right]$

$r(\hat{Y})=CIDEr \left(\hat{Y}, (Y_1, Y_2, \ldots) \right)$

目的関数を書いたらそのままbackpropagationしたくなるのが人情ですが、$\mathcal{L}_{\theta}$はCIDErを使っているので微分できません。

そこでREINFORCEでは、方策勾配定理に基づいて、学習パラメータ$\theta$に対し、以下のように方策勾配を求めることができます。

$\nabla_{\theta} \mathcal{L}_{\theta}=-\underset{\hat{Y} \sim \pi_{\theta}}{\mathbb{E}}\left[\nabla_{\theta} \log \pi_{\theta}(\hat{Y}) \left( r(\hat{Y}) - r_b \right) \right]$

一ステップごとにみれば、こう書けます。

$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, s_{t+1}, c_{t}\right) \left( (\sum_{t'=t+1}^{T}{r_{t'}}) - r_b \right)}$

ここで、$\sum_{t'=t+1}^{T}{r_{t'}}$は時刻$t$からエピソード終了時までのリターン実績と呼ばれるものです。時刻$t$以前に受けた報酬を切り捨てた報酬の総和だと解釈できます。
ただし、言語生成の強化学習では即時報酬はなく、遅延報酬のみを考慮するため、結局以下のように書けます。

$\nabla_{\theta} \mathcal{L}_{\theta}=- \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, s_{t+1}, c_{t}\right) \left( r(\hat{Y}) - r_b \right)}$

$r_b$というのは強化学習で「ベースライン」と呼ばれているものです。$r_b$自体はパラメータ$\theta$を含まないので、任意の値に対して方策勾配は理論上不偏となりますが、$r_b$を報酬の平均値として設定することで、方策勾配の分散を下げることができ、学習をしやすくさせることができます。

1エピソードで最適化するのか?ステップごとに最適化するのか?

学習の方法として、1エピソード終わったものをbackpropagationするのか、1ステップごとに最適化するのか、どちらなのかが気になりました。しかし、よく考えてみると、1ステップごとに新しいトークンをサンプリングした時に勾配のチェインは切れるので、基本は1ステップごとに最適化するものだと考えて良いかと思います。エピソード終了時にならないと報酬が計算できないので、各時刻の$\pi_{\theta}$の出力確率分布と生成した$y_{t+1} \sim \pi_{\theta}$の値を保持しておく必要があります。

解釈?

$\nabla_{\theta} \mathcal{L}_{\theta}= - \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T} { \nabla_{\theta} \log \pi_{\theta}\left(\hat{y}_{t+1} \mid \hat{y}_{t}, s_{t+1}, c_{t}\right) \left( r(\hat{Y}) - r_b \right)}$

教師あり学習に慣れ親しんだ身として上の式をみると、REINFORCEの式は「自分で生成したサンプル(トークン)を擬似的な教師データとして、評価が高いサンプルに高い重みをつけて学習する操作」だと考えるとしっくりきます。(論文ではEq. (15),(16)に同じような話がありました)

REINFORCEの派生手法:Self-Critic (SC) models

REINFORCEの派生的な研究として"Self-critical Sequence Training for Image Captioning (CVPR2017)"というのが提案されています。

REINFORCEでのベースライン計算は(モンテカルロ)サンプリングした系列を用いているので、分散の低減の効果が十分ではありません。

そこで、Self-Criticでは、このベースライン計算に用いる系列を、サンプリングしたものでなく特定の推論アルゴリズムに従って生成した系列を用いて計算する手法になります。例えば論文ではgreedy searchを使っていました。

動機としては、「greedy searchより良い系列が生成できたら+の報酬を与えたい」というシンプルなアイデアから始まったようです。これを実現する方法として、ベースラインをgreedy searchで生成した系列をベースラインとして利用し、単純なREINFORCEよりも実験的に良い結果を示したとのことです。

Actor-Criticを関連研究として挙げており、Actor-Criticに対してCriticのモデルを必要とせずに使える点を利点として主張していました。(いうて直接Actor-Criticとは比較してるわけではないです)

さて、長くなってきたので本日はここまでにしたいと思います。
サーベイ論文は他にもActor-CriticとQ-learningの話が載っています。後日、こちらの記事も更新したいと思います。今のところ以下の記事を執筆予定です。

実験編では、実際にコードを動かしてみてどのような結果になるか見ていこうと思います。

強化学習苦手の会(もくもく会)をはじめて2ヶ月近く経った結果

この記事は強化学習苦手の会 Advent Calendar 2020の1日目の記事です。

こんにちは、品川です。はじめましての方ははじめまして。
最近、強化学習苦手の会というのを始めました。強化学習苦手の会もはじめてから早1ヶ月以上経ったので、一つ発表の機会があるといい感じの目標になるのではないかと思い立ち、このAdvent Calendarをはじめた次第であります。ワイワイやって多くの方に知ってもらいましょう!(なので空いてる日を埋めてほしい)

強化学習苦手の会とは

強化学習苦手の会では、水曜夜と日曜朝に集まって2時間ほど自分で好きな強化学習のプロジェクトを進めて交流するもくもく会というのを行っています。

「苦手の会」という字面はちょっと後ろ向きで珍しいかもしれません。気持ちとしては、強化学習の勉強を始めたばかりの方(私です)や、一人で勉強しているけどなかなか一人だと進めるのがツライと思ってらっしゃる方(私です)の学習支援を行いたいという気持ちがあり、少しでも参加の敷居を下げたいという気持ちがあってこんな名前になっております。「若手の会」と紛らわしい名前なのは、8割くらい私がノリで決めてしまった面もありますが、2割くらいは「若手の会」と一つセットで覚えてもらいやすいのではないかなという狙いがあります。

苦手の会は若手の会の分会という形をとらせてもらっています。若手の会が主に情報交換やチュートリアル輪講などの勉強会を開催する場であるのに対して、苦手の会では実際に参加者が能動的に行動して学習する場となるのを目指しています。

これを具体的に実現するのがもくもく会です。

もくもく会とは

もくもく会は、一言でいうと「時間を決めて、皆で集まってもくもくと自習をする会」と言えばだいたい想像がつくかと思います。

この会のねらいは4つあります。

  • 予め時間を決めることで、忙しい中でも勉強時間を確保でき、勉強ペースを保てる
  • 他人の存在があるので、自分の気まぐれに左右されにくい
  • わからないところが出てきたら、他の参加者に質問できる
  • 他の参加者と交流できるので、情報交換ができる

これを実現するために、現状の運用では以下の2つを一セッションとして、2度繰り返しています。

  1. 45分間:もくもく作業タイム
  2. 15分間:雑談・歓談・質問タイム

実際には最終セッションの雑談タイムでは、話が切りのいいところで途切れるまで自由時間としているので、途中で抜ける方も最後まで残って雑談してる方もいらっしゃいます。入退室は自由としていますので、どなたも気軽に参加していただければと思います。

ここ2ヶ月弱やってみた感想

最初のもくもく会が10月18日だったので、およそ2ヶ月弱やってきたことになります。最初は日程調整にも手探りで進めながらだったのですが、おおよそ水曜19:00~21:00、日曜10:00~12:00で固まってきました。毎回6~8人くらいの人で集まり、自分がどういうことをやっているのかお互いに話し合ったり、最近の論文について話したり、色々な話題が出ていて楽しいです。

個人的には、驚くほど楽に時間が確保できていることが一番驚きでした。いいだしっぺのプレッシャーもあると思うのですが、予め時間を確保しておくことで、「やるか・やらないか」の決断力をいちいち使う必要が無くなったのが大きいです。

これまでも強化学習は対話システムには有望なアプローチなので勉強してきたのですが、どうしても目の前の〆切のプレッシャーに耐えられず途中で断念することも多かったのですが、今ではこの時間を確保した上でのスケジューリングが自然とできてきています。

博士課程でも一番失敗していたのは時間の使い方だったと思うので、もくもく会は有意義なアプローチだと思います。コロナ禍の中、リモートで雑談や研究の話ができるというのも良いなと思っています。ぜひご興味を持たれた方は一度ご参加なさってみてください!途中からの場合は、後ろの雑談セッション中がおススメです。

【備忘録】PyTorchで黒橋研日本語BERT学習済みモデルを使ってみる

品川です。最近本格的にBERTを使い始めました。
京大黒橋研が公開している日本語学習済みBERTを試してみようとしてたのですが、Hugging Faceが若干仕様を変更していて少しだけハマったので、使い方を備忘録としてメモしておきます。

準備

学習済みモデルのダウンロード

下記の黒橋研のサイトから、学習済みモデル(.zip)をダウンロードして解凍します(この時ダウンロードするのはtransformers用のモデルです)
BERT日本語Pretrainedモデル - KUROHASHI-CHU-MURAWAKI LAB

特に、下記の点には注意です。今回はBASE 通常版を使ってみます。

(更新: 19/11/15) pytorch-pretrained-BERTはtransformersという名前にかわっています。こちらを使う場合は以下のモデルをお使いください。transformersで使う場合、モデルの絶対パスのどこかに「bert」の文字列を含んでいる必要があります。例えば、zipを解凍し、 /somewhere/bert/Japanese_L-12_H-768_A-12_E-30_BPE_transformers/ のように配置してください。

  • BASE 通常版: Japanese_L-12_H-768_A-12_E-30_BPE_transformers.zip (393M; 19/11/15公開)
  • BASE WWM版: Japanese_L-12_H-768_A-12_E-30_BPE_WWM_transformers.zip (393M; 19/11/15公開)
  • LARGE WWM版: Japanese_L-24_H-1024_A-16_E-30_BPE_WWM_transformers.zip (1.2G; 20/2/29公開)
Juman++のインストール

入力テキストの前処理にはJuman++が必要です。黒橋研のBERTモデルは最初に全角に正規化された入力文をJuman++で形態素単位に分割し、さらにBPEでサブワードに分割する処理をしているそうです。(詳しくは上記ページ参照)

sudo権限がないならば、下記のように自分のホーム以下にインストールしておくのが良いかと思います。

tar xJvf jumanpp-1.02.tar.xz
cd jumanpp-1.02
./configure --prefix=$HOME
make
make install
pyknp、transformersのpipインストール

また、pythonからJuman++とBERTを呼び出すためのライブラリもpipでいれておきます。

pip install pyknp
pip install transformers

このtransformersは過去の関連記事だとpytorch-pretrained-BERTだったようですが、今はTensorflow版と統合されて一つのライブラリになっているようです。
これに合わせて若干仕様が変更になっているので、使うときには注意が必要です。

ベースのコードを修正して動かしてみる

動かすのにベースとして参考にさせていただいたのは下記の記事です。
pytorchでBERTの日本語学習済みモデルを利用する - 文章埋め込み編 - Out-of-the-box

この記事ではコードも提供してくださってるのでありがたかったです。このリポジトリbert_juman.pyという名前のファイルをベースに動かしてみました。(この記事を書くついでにプルリクも一応送ってみました)
github.com

中身の詳細な説明は上記の記事に譲り、ここではbert_juman.pytransformersを利用するときの変更点のみについて書きます。
bert_juman.pyは全角入力のテキストに対して最上層ひとつ手前の隠れ層のベクトルをとってくるものになっています。
transformersでは、この隠れ層を取得するのに明示的に引数が必要になる点が異なります。

コード上の具体的な変更点は以下の2つです。
まず、ライブラリからのインポート自体は同じようにできるので、ライブラリ名のみを変えます。

import numpy as np
import torch
#from pytorch_pretrained_bert import BertTokenizer, BertModel
from transformers import BertTokenizer, BertModel
from pyknp import Juman

次に、get_sentence_embeddingのmodelのforward部分の引数にoutput_hidden_states=Trueを加えればOKです。ちなみにreturn_dict=Trueをつけてるのは、forwardした時の出力がdictでとれるので便利だからです。これをつけなければtupleで出力されます。

class BertWithJumanModel():
    ...
    def get_sentence_embedding(self, text, pooling_layer=-2, pooling_strategy=None):
        ...                                                                                                                                       
        with torch.no_grad():                                                                                                                                                                            
            # all_encoder_layers, _ = self.model(tokens_tensor) # for pytorch_pretrained_bert                                                                                                            
            all_encoder_layers = self.model(tokens_tensor, return_dict=True, output_hidden_states=True)["hidden_states"]  # for transformers                                                                                                                 

修正したコードで実際に試してみたらこんな感じです。

In [5]: from bert_juman_with_transformers import BertWithJumanModel

In [6]: bert = BertWithJumanModel("../../MODELS/bert/Japanese_L-12_H-768_A-12_E-30_BPE_transformers/")

In [7]: bert.get_sentence_embedding("吾輩は猫である。").shape
Out[7]: (768,)

In [8]: bert.get_sentence_embedding("吾輩は猫である。")
Out[8]:
array([-4.25627619e-01, -3.42006892e-01, -7.15176389e-02, -1.09820056e+00,
        1.08186698e+00, -2.35575914e-01, -1.89862773e-01, -5.50958455e-01,
        1.87978148e-01, -9.03697014e-01, -2.67813027e-01, -1.49959311e-01,
        5.91513515e-01, -3.52201462e-01,  1.84209332e-01,  4.01529483e-02,
        1.53244898e-01, -6.31160438e-01, -2.07539946e-01, -1.49968192e-01,
       -3.31581414e-01,  4.01663631e-01,  3.73950928e-01, -4.13331598e-01,

おまけ

get_sentence_embedding関数内の各変数の表示
text = "吾輩は猫である。"
preprocessed_text = _preprocess_text(text)
tokens = juman_tokenizer.tokenize(preprocessed_text)
bert_tokens = bert_tokenizer.tokenize(" ".join(tokens))
ids = bert_tokenizer.convert_tokens_to_ids(["[CLS]"] + bert_tokens[:126] + ["[SEP]"]) # max_seq_len-2
tokens_tensor = torch.tensor(ids).reshape(1, -1)

print(preprocessed_text)
print(tokens)
print(bert_tokens)
print(ids)
print(tokens_tensor)

#結果
吾輩は猫である。
['吾輩', 'は', '猫', 'である', '。']
['[UNK]', 'は', '猫', 'である', '。']
[2, 1, 9, 4817, 32, 7, 3]
tensor([[   2,    1,    9, 4817,   32,    7,    3]])
BERT modelのforwardの引数と出力の関係

transformersのmodeling_bert.pyを眺めるとわかります。

  • last_hidden_state: 最終層の隠れ層のベクトル(1xtoken数x各tokenのベクトル次元)
  • pooler_output: 最終層の隠れ層のベクトルの内、最初のtokenのみを取り出してdense+tanh()する操作(最終層のCLSに対応するベクトルの抽出)
  • hidden_states: 入力のembeddings、最終層の隠れ層のベクトルも含めた、全層の隠れベクトルのリスト(12段なら1xtoken数x各tokenのベクトル次元のtorch.tensorが13個できる)。リストの後ろの要素ほど最終層に近い層のベクトル。forwardの引数にoutput_hidden_states=Trueを入れると出力される
  • attentions: 各段のtransformerでのforward計算でのattentionのリスト(12段なら1xhead数xtoken数xtoken数のtorch.tensorが12個できる)。forwardの引数にoutput_attentions=Trueを入れると出力される
model.eval()
with torch.no_grad():
    outputs = model(tokens_tensor, return_dict=True, output_hidden_states=True, output_attentions=True)
print(outputs["last_hidden_state"].shape)
print(outputs["pooler_output"].shape)
print(len(outputs["attentions"]), [a.shape for a in outputs["attentions"]])
print(len(outputs["hidden_states"]), [h.shape for h in outputs["hidden_states"]])

#結果
odict_keys(['last_hidden_state', 'pooler_output', 'hidden_states', 'attentions'])
torch.Size([1, 12, 768])
torch.Size([1, 768])
13 [torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12]), torch.Size([1, 12, 12, 12])]
12 [torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768]), torch.Size([1, 12, 768])]

ちなみに

  • BASE版は隠れ層のtokenあたりの次元が768、層数が12、head数が12 (headあたりが担当する次元のサイズが64)
  • LARGE版は隠れ層のtokenあたりの次元数が1024、層数が24、head数が16 (headあたりが担当する次元のサイズが64)

MIRU2020参加報告(8月5日分)

品川です。引き続きMIRU2020の参加報告です。いよいよ最終日です。

自然言語による対話的画像編集システムについての研究を発表しました。

MIRU2020 IS3-2-11 自然言語の編集要求に対して効率的に確認を行う対話的画像編集システム
IS3-2-11 品川政太朗, 吉野幸一郎 (奈良先端大, 理研AIP), Seyed Hossein Alavi, Kallirroi Georgila, David Traum (Univ. of Southern California), Sakriani Sakti, 中村哲 (奈良先端大, 理研AIP)

発表はインタラクティブセッションという、ポスターセッションみたいな形式でした。今回のMIRUはオンライン開催ということもあり、発表形式は自由だったので、私は画面を半分スライド、半分デモの実演という感じで分けて発表することにしました。

発表に使ったスライドはこちらになります。

speakerdeck.com

内容としては、ざっくりまとめると以下のようになります。

  • 自然言語による画像編集は自然言語入力というのは入力の自由度がありすぎるので、画像編集モデルが苦手な表現が入ると意図しない編集が起きうる。なので対話的なプロセスを導入しよう
  • 対話的なプロセスとして複数のモデルからの生成結果で確認するという方法があるが、毎回確認されるのはユーザにとって手間
  • システム側が生成結果に自信がない時だけ確認できるような基準となる手法を提案し、アバター画像編集タスクにおいて確認回数を減らせることを確認した(詳細な結果はIEEE Accessに出した論文に譲る)
  • 確認の基準として、今回は画像変換でよく使われるマスク機構を持ったモデルを対象にしてマスクのエントロピーを確認の基準とした(マスク付きモデルは小さい領域の編集が得意だが、髪などの大きな領域の編集が苦手)

本手法のlimitationとしては、マスクありのモデルに対してだけ適用できる異常検知的な手法になっている点、また、確認にはマスクの閾値がハイパーパラメータとなっている点です。あと、システム側からの自然言語を使ってるわけではないという点です(本当は、対話というからにはそこら辺が機能として欲しかったのですが・・・)

本当は強化学習とかを使って柔軟に解決したいところなのですが、それには対話データが必要というのもあるので、今回はデータを集めるための足掛かり的な立ち位置といった感じになりました。確認閾値のハイパラは、対話的なフィードバックで制御することくらいはできたかなあと思っています。

他にも色々試していたことはあったのですが、博論を書かなければならないという時間制約もあり、不満はありながらもひとまず現状できてることで形にすることを優先しました。

発表当日には、Telegram-botを使ってデモを実装し、実演を交えながら説明していました。
このデモの利点はTelegramをインストールしていれば誰でも試せる点だったのですが、やっぱりTelegram皆使ってないのであまり試してもらえなかったのが反省点ですね・・・Telegram-botは対話デモを簡単につくれるので重宝しているのですが、他の方法を考えるか自分でデモのプラットフォームまで作る必要がある気がしています。

発表でやっといて良かったのは、事前にちゃんと宣伝をしておいてスライドなども事前にアップしていたことだと思います。予想以上にたくさんの方が見に来て下さり、途中からは説明やデモよりも、次々来る質問に順番に回答するというスタイルになりました。

「面白い研究だ」と言っていただいて嬉しい反面、それはおそらく「今後が面白い研究だ」という意味であり、現状その期待される面白さにはまだ遠く至っていない自覚があるので、気を引き締めて研究を進めていきたいなと思います。とりあえず、私ができたら面白いなと思っていることが他の方もできたら面白いと思っているというのが確認できたのが大きな収穫でした。これからは確信をもって頑張れます。議論して下さった皆様ありがとうございました。

gatherというアプリがあるらしい

私はデモの調整がまだ残ってたので参加できなかったのですが、MIRUの懇親会でgatherというアプリが使われてました。RPG風のワールド上で、自由に自キャラを動かして近くの人とコンタクトして喋れるというもののようです。後日試してみたらchromeだとカメラがうまく動かず、firefoxだと動きました。これは便利なので何か多人数のオンラインの集まりがあった時には使いたいなと思います。

gather.town

その他見た発表

IS3-1-7 擬似陰影を用いたフレーム間追跡によるアニメ線画の自動着色

陸儀, 中島克人 (東京電機大)
アニメ線画の自動着色の研究でした。線画の着色は大部分が白色で輪郭情報にしか輝度勾配が無いというスパースな情報なので、輝度勾配のあるグレーケール画像を着色するよりも難しさがあります。本研究ではこの点に着目し、線画に擬似的に陰影を与えることで自動着色の精度を上げようというコンセプトになっていてなるほどなと思いました。この擬似陰影は別の学習済みモデルによって与えているのですが、この陰影自体は着色時に悪影響を与えないかが気になりました。元々実験に使っているのが著作権の切れてるトムとジェリーの動画だったので、古いアニメゆえに着色後の画像に陰影の影響が出るのはむしろ味になって良いと思いますが、最近のアニメに適用すると結果がどう変わるのかとかが気になる所です。

IS3-1-8 SLGAN: Style-guided and Latent-guided GAN for Desirable Makeup Transfer and Removal

Daichi Horita, Kiyoharu Aizawa (UTokyo)
顔画像にメイクを施す&除去するという画像編集タスクを行うGANの研究でした。顔画像をリファレンス画像のメイクに近づける上で、元画像の本人らしさが変わらないようにするってのは結構難しそうだなあと思いました。Perceptual Makeup Lossというのがあるのは初めて知ったので勉強になりました。メイクタスクはGANの有望な使い道なので今後の研究の進展にも期待してます。

IS3-3-10 線画周辺マスクの画像補完によるイラストの見栄え向上

粟根啓太, 坪田亘記, 幾田光, 松井勇佑, 相澤清晴 (東大)
初心者が描いたいわゆる拙いイラストを、画像補完によってイイ感じにする研究でした。基本的には、うまいイラストで事前に画像補完タスクを学習しておきます。推論時には輪郭部分を中心にマスクを生成し、一方で全体的な構造や色合いを保つために、編集前の元イラストにガウシアンフィルタをかけてぼやかした画像を生成して画像補完に用います。ぼやかした画像にマスクを重畳した画像を入力として補完することで、全体的な構図を保持したまま、イラストが補正できるようです。アイデアが素直で良いアプローチだと思いました。手によるオクルージョンが入っていると失敗しがちという話があったので、ぼかし方を工夫したりできたらもっと面白いことができそうな気がしています。全身画像への拡張もできそうで面白かったです。

IS3-3-12 Handwriting Generation by Imitation Learning

Keisuke Kanda, Brian Kenji Iwana, Seiichi Uchida (Kyushu Univ.)
generative adversarial imitation learning (GAIL)を使って手書き文字を生成する研究でした。GAILはActor-Criticベースの強化学習にGAN的なアプローチを組合わせた深層生成モデルです。ある状態sにおいて、Actorは行動を生成し、Criticは価値を計算し、Discriminatorは行動の結果の報酬を出力します。GAILはいつか触りたいなと思っていたので勉強になりました。強化学習ベースの方法はインタラクティブ性という点でもRNNベースの方法より応用が利くかなと思っているのでここら辺の進展は面白いですね。学習は結構不安定で大変という話だったのでやっぱりなあという感じではありますが・・・

IS3-3-17 インスタンスマップから多様な画像への合成変換

大石涼火, 数藤恭子 (東邦大)
Semantic segmentation画像からの画像生成は最近の流行りですが、物体のセグメンテーションが隣接していると物体同士の境界部分で生成が難しくなるという問題があります。本研究では、セグメンテーションをインスタンスごとに区別するために、各インスタンスのセグメンテーションに、異なる乱数でインスタンスの中心からの位置に勾配を持たせています。これによって隣接部分がネットワークに分かりやすくなるという寸法で、なるほどとなりました。乱数はいわゆるスタイル情報に対応しているようで、同じ乱数を与えると同じ色合いで車の色が塗られたりといった特徴があるのが面白かったです。

全体を総括して

MIRU初のオンライン学会ということで、〆切がいきなり延びてたりデモセッションが中止になったり発表形式が自由でインタラクティブセッションが超ロングオーラルと化していたり、Slackに#学生 #自称若手 #真の若手チャンネルが立って覇を競ったりと最初から最後まで話題に事欠かない学会でした。運営の皆様は特に大変だったかと思います。無事まとめて下さりありがとうございました。

受賞には朝ランの会の方々が多かったです。やはり朝ランを実行できるほどのバイタリティが研究には重要ということでしょう。実は私も参加しようと思ってたのですが、見事に寝坊したので来年チャレンジしたいと思います。

個人的な都合でタスクの積まれ具合がルナティックモードでなければ懇親会とかももっと楽しめてたと思うので、来年は万全を排して参加したいと思います!(フラグ)

MIRU2020参加報告(8月4日分)

品川です。MIRU2020の参加報告の続きです。8月4日分です。

藤吉研のAttention Branch Networkへの愛がすごい

Attention Branch Network (ABN)は、Class Attention Map (CAM)のような画像認識の予測の注視領域の可視化を訓練時に自動で学習しつつ、予測性能向上にも寄与する手法です。 この前身となる技術であるCAMでは、画像認識モデルの最終層の部分を特徴マップをGlobal Average Poolingして重みづけしてLogistic regressionのようにして学習を行います。 つまり、この学習された重みの大きさから、どの特徴マップが予測に寄与しているかを可視化することができます。 ただし、このCAMはGlobal Average Poolingを用いていることで、予測性能を低下を招いてしまうという問題がありました。

そこで、ABNでは、ネットワークを途中で2つに分岐させます。予測のための分岐(Perception branch)と注視領域の可視化のための分岐(Attention branch)で役割分担をすることで、性能低下を抑えながら可視化を行うことができるようになりました。具体的には、注視領域をマスクとして出力し、分岐部分の特徴量に重畳する形でフィードバックし、残差接続によって特徴量を更新します。これによって、予測に寄与する部分の特徴量が強化されるように学習が進むようです。結果として、ABNを使わない普通の認識モデルよりも性能が上がるという美味しさがあります。

MIRU2018で初めて見た時はただ感心してただけだったのですが、これを考案した藤吉研では猛プッシュが続いています。 シンプルかつ汎用的かつ強力な手法が1つ出てくると、研究室全体がそれに注力して後続研究を続々と生んでいく傾向ってありそうだなと思います。深化も横展開もしやすいし、何よりノウハウが継承されるのがデカいですね。皆使えると深い議論もしやすいのだと思います。

NAIST中村研でもSpeech Chainが出てから音声班の後輩氏らはSpeech Chain childrenが多いなあという感じです。動くコードがあるし、ノウハウがあると応用しやすいんですよね。私もそういうの出せるようになりたいですね・・・

今回もいくつかABN childrenを見かけましたが、個人的に面白かったのは以下の研究でした。

OS1-3A-3 丸山祐矢, 平川翼, 山下隆義, 藤吉弘亘 (中部大) Deep Q-Networkによるロボットの自律移動におけるAttention branchによる判断根拠の獲得

こちらは、入力画像と指定されたゴールの位置情報を入力として、ロボットがゴールに向けて移動していくというタスクの研究です。強化学習手法の一つであるDQNによってロボットの行動を学習したあと、Attention branchを接続して、DQNの予測した次の行動を教師としてAttention branchを学習することで可視化を行います。後付けで元のモデルの精度を落とさずに可視化ができるのが面白いなと思いました。他のタスクにも応用できそうですね。 ただ、ABNみたいにフィードバックをつくらなかったのはなぜなのかちょっと気になる所です。強化学習でABNにした場合は学習が安定しないとかですかね? 仮に学習した後にABNみたいに結合させるとかはうまくいかないのでしょうか?残差接続してるので、catastrophic forgettingは比較的起きにくいような気もします。個人的にはまだポテンシャルを感じました。

YouTube風のサムネイル画像が人気

インタラクティブセッションで、Slack上で好評だったのがYouTube風のサムネイルの発表でした。
NAIST向川研の学生さんの発表が特に好評で、確か賞もとってたかと思います。
これからはサムネも頑張らないといけないですね・・・

その他、見にいった発表

OS2-1A-1 背景学習による対象領域抽出

中村凌, 植田祥明, 藤木淳, 田中勝 (福岡大)
午前中寝坊してちょっとしか見れなかったですが、異常検知的な方法で前景情報となる物体の領域を抽出する手法です。 物体ラベル(犬、猫など)のついた1物体画像と背景(BG)ラベルがついた大量の背景のみ画像を用意しておいて、小領域のパッチからラベルを予測するCNNを学習させます。 そうすると、背景画像が多数であることで、1物体画像の予測を行った時に、背景情報に属するパッチが前景情報(物体)に属するパッチよりも相対的に強く背景(BG)と予測されるようになります。 これによって、画像中の前景情報をあぶり出す、という研究です。非常に素直な方法で簡単に実装できそうという点がいいなと思いました。 背景情報にバイアスされたくないというタスクもあるので、そういう時に手軽にできる前処理として使いたいなあという気持ちです。

OS2-1A-4 コンテクストを考慮したChannel-wise AttentionによるSemantic Segmentationの改善

長内淳樹, 森巧磨, 山崎雅起, 谷口恭弘 (本田技術研究所)
第二著者が研究室の後輩の子だったので聴きに行ってみました。手法としては、特徴マップにchannelごとの重みづけを行うことでSemantic segmentationの性能が向上するという内容です。
書いてて気づきましたが、これ残差接続の無いABNにだいぶ似てますね。2つに分岐している点、フィードバックがある点、attention branchに相当する方の分岐でも予測を行っている点が似ています。異なる点は、領域ではなくchannelレベルでのフィードバックという点でしょうか。同じ特徴量を基にしてattentionを計算しているので、気持ちとしてはself-attentionとも近い気がします。 この手法によって、各セグメンテーションラベルの予測を担当するチャネルが綺麗に分かれるようですね。最新の手法との比較とかは無かったような気がするのですが、比較するとどうなるのか気になります。

OS2-2B-5 画像生成ネットワークの逆伝播に基づく繰り返し処理による物体の6D姿勢推定

荒木諒介, 大西剛史 (中部大), 平野正徳 (CKD), 平川翼, 山下隆義, 藤吉弘亘 (中部大)
透明な袋など、直接的に姿勢推定するようなものが難しい物体に対して、画像生成モデルを利用して段階的に物体の姿勢推定を行う手法です。 画像生成モデルは、姿勢のパラメータから画像を生成するモデルになっており、パラメータから生成された画像と目標画像との損失を計算して勾配を逆伝搬し、パラメータを更新するという方法です。
最初は解像度を低く、徐々に大きくするなどの工夫もあって面白かったです。

IS2-2-21 キャプショニングを用いた 画像中の重要領域判別手法の検討

鈴木拓, 佐藤大亮, 宮崎智, 菅谷至寛, 大町真一郎 (東北大)
東北大大町研の研究です。大町研はバリバリ画像というイメージだったのですが、image-captioningということで物珍しかったので聴講しました。 画像の重要領域の情報をなるべく落とさないように符号化するROI符号化を行うための方法として、captionの情報を使うという研究でした。大町研っぽい~という気持ちになりニッコリしました。 今後の発展性として、インタラクティブな方向性にも拡張できそうで個人的に面白かったです。

OS2-3A-1 知識転移グラフによるアンサンブル学習

岡本直樹, 南蒼馬, 平川翼, 山下隆義, 藤吉弘亘 (中部大)
1つのネットワークでなく、複数のネットワークがお互いに知識を教え合う知識転移を行いながらアンサンブル学習を行う手法です。 前身となる技術としては、学習済みの教師モデルの予測分布を教師として生徒モデルを学習する(知識を転移する)Knowledge Distillation (KD)と、 複数の未学習モデルがお互いに教え合うように学習する Deep Mutual Learning (DML)があります。 本研究は、各モデルの対応するattention mapの重なりを明示的に離すように学習を行い、各モデルが概念の予測に特化するように学習させる手法になっています。 この技術の前提として、アンサンブルによる精度向上と、予測分布のKL divergenceの大きさが相関関係にあることも予備実験として調べており、勉強になりました。

OS2-3A-3 ドメイン汎化モデルにおける分布外検知

広橋佑紀, 岡本大和, 武良盛太郎 (オムロン), 橋本敦史, 米谷竜, 牛久祥孝 (OSX)
分布外検知 (Out of Distribution Detection)の研究です。テスト時の入力が訓練時の分布と異なり過ぎていると対応できない問題が起きるので、これを自動的に検出したいというのがモチベーションです。 ドメイン汎化 (Domain Generalization: DG)モデル [8], [10]というのは、未知のテスト分布が訓練時の分布とあらかじめ離れている可能性を考慮しながら、このドメインのシフトに頑健に学習する方法らしいです。 この名前は初めて聞いたのですが、基本的には敵対的学習で、ドメインの予測が困難になるようにエンコーダを学習させる学習手法を指しているようです。

  • [8] Li, D., Yang, Y., Song, Y.-Z. and Hospedales, T.: Learning to Generalize: Meta-Learning for Domain Generalization, AAAI (2018).
  • [10] Liu, Y., Wang, Z., Jin, H. and Wassell, I.: Multi-task adversarial network for disentangled feature learning, CVPR (2018).

本研究ではドメイン汎化モデルによる予測がうまくいくかどうかを、ネットワークへのRing損失[18]という形で実現します。 Ring損失は特徴量を超球上に射影するための損失です。Ring損失を用いた分類タスクでは、特徴量を超球上へ射影し、超球上の位置によって二値分類や多値分類を行います。 (二値分類では二値に対応する2つの超球を用意し、ノルムの長さから分類を行うようです) 気持ちとしては、特徴量ベクトルにおけるノルムまたは角度を制約することで高次元空間でのカテゴリ予測を頑健に行う手法のようです(たぶん)

  • [18] Zheng, Y., Pal, D. K. and Savvides, M.: Ring Loss: Convex Feature Normalization for Face Recognition, CVPR (2018).

本研究が着目した点は、このリング損失に基づいたカテゴリ予測を行う時に、分布外の入力が入った場合は予測されるノルムが超球上から離れていくという点です。 実験では提案手法が分布外サンプルを検出できたかどうかをF値で測っており、十分な向上があったように思えました。
この研究は自分のタスクにも応用できそうで、興味深かったです。

IS2-3-18 クラス不均衡なソースデータを用いた敵対的ドメイン適応

金子智一, 寺尾真 (NEC)
異常検知のようなクラス不均衡のタスクでドメイン適応を行うという主旨の研究でした。 ソースとターゲットの両ドメインでクラス不均衡があるのが特徴です。 本研究では、2クラス分類のクラス不均衡を解決する方法として使われるAUC 最適化学習[7, 8]を導入することで問題の解決を試みていました。 仮定として、両ドメインのクラスの不均衡具合は同じ程度という仮定があるそうですが、プライベートな実験で確認した限りでは提案手法は両ドメインの不均衡具合が多少異なっていても頑健に動作するそうです。

  • [7] Sakai, T., Niu, G. and Sugiyama, M.: Semi-Supervised AUC Optimization Based on Positive-Unlabeled Learning, Machine Learning, Vol. 107, No. 4, pp. 767–794 (4月 1, 2018).
  • [8] Ying, Y., Wen, L. and Lyu, S.: Stochastic Online AUC Maximization, Advances in Neural Information Processing Systems 29 (Lee, D. D., Sugiyama, M., Luxburg, U. V., Guyon, I. and Garnett, R., eds.), Curran Associates, Inc., pp. 451–459 (2016).

再び首が逝った

久々に首が痛くて寝てたら午前中のオーラルを聞き逃してしまいました・・・
ちなみに原因は姿勢の悪さで、しばらく博論に追われて懸垂をさぼってたツケがきたらしいですね。
ちなみに懸垂したら改善しました。懸垂は全てを解決しますね。
それはそれとして良い椅子を買うことを決意しました。博論の最終審査も無事終わったので、学位取得前祝いとして購入を検討したいですね。。。

紹介していただいたところ

中古の通販でもまあまあイケるらしいですね。とりあえず色々試しに座ってみたいので、まずはショールームに行こうと思います。

MIRU2020参加報告(8月3日分)

品川です。MIRU2020に参加しているのでいくつか気づいたことなど。

集中力、持たない

オンラインから接続しているためか、並列でSlack(MIRU本会議用)とtwitterを開けてしまうので、そのままにしておくと流速が速くて楽し過ぎて本番の発表に集中できない問題がありました・・・初日はだいぶ要点を聞き逃してしまいました・・・。
発表に集中するために、明日からはセッション中は両アプリを閉じてノートに発表の要点を書き下しながら聞くことにします。マルチタスクは厳しい。

インタラクティブセッションという名の超ロングオーラルが聞いていてつらい

Slack内でも議論が上がっていましたが、インタラクティブセッションでの1周あたりが重いご発表が多いです。1件の発表だけで15~20分くらいかかってます。

特定の発表だけ聞きに来たという目的の人にはマッチすると思いますが、広く浅く色々な研究の情報を仕入れたい私には非常にツライです。例年のポスター発表と同じで最大でも5分で一周まとめて欲しい気持ちがあります。
途中から入ってきた人にも優しくないですし、もっと良いやり方があると思います。

例えば、slackやzoomのチャット欄に外部資料として発表のスライドやポスターのPDFを貼るなどの工夫があると良いと思います。
実際にやられていた他の工夫としては、思い切ってスライド1枚で説明して、詳しい内容はオーラルの発表や論文を見てください、としているご発表もありました。こちらの方が質問する方としてはやりやすかったので一つの手だと思いました。
従来のインタラクティブセッションと比べると、聴衆に伝えられる情報量には限りがあるように思います。
少ない情報量でいかに印象に残すか、あとで論文を読んでもらうかに焦点を当てた方が良さそうです。私は8/5の13時からのインタラクティブセッションでの発表なので、情報を絞って簡潔な発表にしようかなと思います。

発表について

チュートリアルQA 鈴木大慈 (東京大学) 深層学習の数理:カーネル法,スパース推定との接点

鈴木先生による深層学習の理論の最近の進展についてのチュートリアル講演です。完全にヤムチャの気分になれてとても良かったです。内容としては、タイトルにもあるようにカーネル法とスパース推定との根っこの共通点や違いについて解像度の高い説明をされてました。一回目はヤムチャだったので、公開されてる8/9までの間に腰を据えてもう一度観直そうと思います。
(Gradient boostingの方はまだ観てないのでこれから楽しみです)

OS1-1B-2 邵文 (東大), 川上玲 (東工大), 苗村健 (東大) 映像生成による時間順序の並べ替えで学習した時空間コンテキストに基づく異常検知

ロングオーラルのご発表を聴講しました。時間順序をバラバラにされた映像情報から元の時間順序を生成ベースでソートし直す学習を行うことで、生成が難しいフレームを異常とする手法です。 生成の難しさを異常の指標とするのは最近よくあるので、これを動画でやったのは良い発想だなと思いました。

OS1-1B-3 杉山優, 岡本開夢, 柳井啓司 (電通大) 意味と形状の分離によるマルチモーダルレシピ検索及び画像生成

ロングオーラルのご発表を聴講しました。MUNITで意味情報と形状情報を分けて生成の精度を上げることで、レシピ検索の性能が向上する結果が得られたとのことです。 良い結果が出ていて良いと思うのですが、スコアの違いが既存手法と比べてどこらへんに出ているのかはよく分かりませんでした。 サンプルごとの先行研究との比較の結果がいくつか見たかったです(見逃したかも)。論文を見ると図4に一例が載っていて、どうやら先行研究はそもそも形状もテクスチャもめちゃくちゃなので、その辺の違いが効いていそうです。
(もう少しdetailedな部分での勝負かと思ってたがそうではなかった・・・)
segmentationに条件づけられた生成ならdetailedな画像が生成できると思うのですが、そうしないのは問題設定的にsegmentationのsemantic labelが得られないようなレシピ画像にも適用したいというモチベーションがあるのでしょうか?ちょっと気になります。

OS1-1A-5 西村和也, 林田純弥 (九大), Chenyang Wang, Dai Fei Elmer Ker (香港中文大), 備瀬竜馬 (九大) 弱教師付き学習に基づいた細胞トラッキング

ロングオーラルのご発表を聴講しました。細胞の動きをトラッキングするのに、学習済みの物体検出ネットワークを利用して教師データとして学習する手法です。
擬似的な教師データで誤りを含むということで弱教師ありということのようです。 基本的にはフレーム間における近い位置の細胞に対して中間層の同じ位置のニューロンが反応すると仮定して、そのニューロンからのbackpropにより変化する画像の一部分をマスクとして設定し、マスク内の細胞を同一の細胞として判断してトラッキングを学習するようです。 limitationとして、細胞は分裂したりするので、その場合には対応できなかったり、オクルージョンがあると少し難しいとのことでした。
教師データを擬似的に作って既存の学習モデルでなんとかするというアプローチは私も好きなので面白かったです。 マスクの作り方がちょっと頭になかったので面白かったです。

OS1-1B-6 Ryuhei Hamaguchi (AIST), Yasutaka Furukawa (Simon Fraser Univ.), Masaki Onishi, Ken Sakurada (AIST) Graph Residual Networks for Semantic Segmentation

ロングオーラルですが、聞き逃してしまったのでインタラクティブセッションで聴講しました。ノードをsegmentationのガイドとするsegmentationです。従来のグリッドベースの手法と比べて、ノードの位置が学習の進度に応じて適応的に変化するので、空などの一様なセマセグには疎なノード配置、オブジェクトなどの込み入った構造に対しては密なノード配置となるように学習されます。精度、計算効率の面で従来手法よりも良いようです。graphベースの手法はCVPR2020の論文でさんざん読んだので、興味深いご発表でした。

暦本先生の招待講演

これからのHCI研究についてのご講演でした。AI Integrationは個人的にも面白いなと思います。個人的にも、人間の能力はデバイスでもっと拡張できると面白いなと思います。

OS1-3A-2 幡谷龍一郎 (東大, 理研AIP), ズデネクヤン (東大), 美添一樹 (理研AIP), 中山英樹 (東大) MADAO: データ拡張最適化のためのメタ的アプローチ

ロングオーラル、インタラクティブセッション両方聴講しました。Faster Autoaugmentの幡谷さんの新作でした。CNNの学習とデータ拡張戦略を最適化するのはバラバラに最適化する必要があり、個々の学習も計算量が大きいという問題がありましたが、提案するMADAOでは同時最適化することができるとのことです。勾配計算にはヘッセ行列の逆行列が出てくるのですが、これをノイマン級数で近似して解決しており、へぇ~っとなりました。名前はMADAOなのにちゃんと仕事しててすごいなという気持ちです。

OS1-3A-3 丸山祐矢, 平川翼, 山下隆義, 藤吉弘亘 (中部大) Deep Q-Networkによるロボットの自律移動におけるAttention branchによる判断根拠の獲得

ロングオーラルのご発表を聴講しました。DQNで一度学習したネットワークを固定して、DQNの出力のactionを教師データと見なして教師あり学習を行い、Attention branchを学習して行動の判断根拠を得るというものです。straight forwardな仕組みでなるほどなとなりました。

OS1-3B-4 高橋龍平 (京大), 橋本敦史 (OSX), 薗頭元春, 飯山将晃 (京大) 事前分布シフトを考慮した変分自己符号化器による教師なしドメイン適応

ロングオーラルのご発表もありましたが、インタラクティブセッションで聴講しました。事前分布シフトとは、ドメイン間の持つラベル情報が大きく異なることを指すとのことです。MNISTなら一方は色んな数字、もう一方が色々な7だけ、といったような場合を指すようです。事前分布シフトの問題を解決するため、CycleGANで同じラベルの各ドメインのデータを生成してペアとし、姿勢推定問題におけるドメイン適応を頑健に行う方法のようです。ちょっと他の発表も聞きたくて途中で抜けたため最後までは聞けませんでした。