読者です 読者をやめる 読者になる 読者になる

自然言語処理の深層学習において転移学習はうまく行くのか?

機械学習 自然言語処理 深層学習 論文100本ノック

このエントリはDeep Learning Advent Calendar 2016 5日目のエントリです。EMNLP2016に出ていたHow Transferable are Neural Networks in NLP Applications?を読んだので、それについて書きます。

モチベーション

画像方面では、あるタスク(source side)で学習させた深層学習の結果を、別データセット(target side)でソフトマックス層だけ再学習させる転移学習(Transfer Learning)がうまくいっていると報告されています。

あるタスクでうまくいった深層学習の重みやネットワーク構造を他のタスクに適用させることができれば

  • 再学習の手間が減る
  • source sideのおかげで、target sideで学習させるデータ量も少なめでもよい精度を出る(ことが期待できる)
  • 深層学習で問題になりやすい過学習の問題を回避しやすくなる

などのメリットがありそうです。深層学習が登場する以前から、自然言語処理の分野でも転移学習の研究はされていましたが(EasyAdapt、instance weighting、structural correspondence learningなどが有名。余談だが、特にEasyAdaptはむかつくほど簡単なのにうまく行く)、深層学習の場合では、うまくいったと報告している論文もあれば、あまり精度は向上しなかったと報告している論文もあります。

この論文は自然言語処理での深層学習の有効性について、システマチックに調査することを目的としています。これを調査するために複数タスクにおいて埋め込み層、中間層、出力層をそれぞれ転移させる/させないの組み合わせで実験した結果を報告しています。結果としては、画像ほどうまく行かないといった感じの結果になっているようでした。世の中甘くはなかった...。

実験設定

データセット

データセットは全部で6つ実験していますが、大きく分けるとSentence classificationのタスクとSentence-pair classificationのタスクに分かれます。それぞれのタスクにおいて、あまり難しいネットワーク構造は出てきません。

Sentence classificationのタスク

3つのデータセットからなります。

  • 文がpositiveかnegativeかを分類させるタスク(IMDB、MR)
  • 文が場所、時間、数など(6種類)のどれについて聞いているかを分類させるタスク(QC)

の2つです。IMDB => MRで転移学習させる際は意味的に似たタスクを解かせていることになりますが、IMDB => QCだと意味的に大分違うタスクを解かせていることになります。

解かせる方法は基本的なLSTMで、最後にsoftmaxでどれかのクラスを吐く構造です。論文よりネットワーク構造の図を引用します。

f:id:syou6162:20161204234925p:plain

Sentence-pair classificationのタスク

3つのデータセットからなります。

  • 文のペアのentailmentを認識させるタスク(SNIL、SICK)
  • 2つの文が同じ意味を持つかどうかを当てるタスク(MSRP)

解かせる方法はCNNベースの方法で、そんなに凝った方法ではありません。ネットワーク構造の図(論文より引用)を載せておきます。

f:id:syou6162:20161204234945p:plain

転移学習の方法

これも大きくわけで2つ用意しています。まず1つ目は転移学習の一般的な方法でsource sideで学習した結果をtarget sideで使うという方法(INIT)。今回の実験の場合はsource sideで学習したものをtarget sideの初期値として利用するというものです、それだけ。2つ目は転移学習というよりはマルチタスク学習として解く方法(MULT)。目的関数をそれぞれのタスクの線形和でつないだものを一度に学習させます。

論文ではMULTとINITを組み合わせた方法でも実験されていますが、それほどうまく行っていないので省略します。

結果

論文では色々結果が書いてありますが、全部書いていると長くて疲れるので要点だけまとめます。あまりいい感じの実験結果ではないですが、知見が共有されたという感じの論文かな...。

  • 自然言語処理の深層学習で転移学習がうまく行くかどうかはタスクが意味的にどれくらい似ているかにかなり依存する
    • 似ていないタスクだとかえって下がることもある
  • 出力層はほとんど転移できないものだと思っておいてよい。一方、単語の埋め込み層は意味的に異なるタスクであってもそこそこ転移がうまくいきやすい
  • MULTとINITの組み合わせはそんなによくならなかった

参考

深層学習 Deep Learning (監修:人工知能学会)

深層学習 Deep Learning (監修:人工知能学会)

  • 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
  • 出版社/メーカー: 近代科学社
  • 発売日: 2015/11/05
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る

異常検知本の読書メモ Part 1

機械学習 異常検知

異常検知本を最近読み進めていたので、自分が知らなくて新しく勉強になったところのみメモ。

ホテリングの{T^{2}}法による異常検知

  • 異常度a(x)はマハラノビス距離で与えることができる
  • サンプル数Nが次元数Mより圧倒的に多い場合はa(x)は自由度M、スケール因子1のカイ二乗分布に従う
    • これによりカイ二乗分布で欲しい閾値(逆関数か対応表から)を決めておく
  • 「カイ二乗分布の分散は2Mであるため、精度よく異常検知をするためにはなるべく変数選択をするか部分集合毎にT^{2}を計算するのがよい」と書いてあってナルホド感があった

単純ベイズ法による異常検知

  • naive bayesのところまぁ知ってるので飛ばす
  • ベイズ決定則とネイマンピアソン決定則の関係のところは勉強になった
    • ベイズ決定則は異常判定を強く抑制する傾向にあるので、既存の二値分類の実装をあまり深く考えずに異常検知に使うと異常標本精度が非常に低くなってしまうため注意が必要

近傍法による異常検知

  • いわゆるkNNによる方法
  • 距離尺度をユークリッド距離を使うことが多いが、もう少し頑張りたいので計量学習(metric learning)を入れる
    • カーネルほどは自由にはできないけど、半正定値行列を間に挟んで距離を計算することにより空間をいい感じ(後述)に歪める
    • 計量学習で学習するのは半正定値行列
    • 計量学習の中でも安定した性能を出せるマージン最大化近傍法が紹介されている
  • 目的関数には以下の2つの観点が盛り込まれている
    • 同一ラベルの標本はなるべく密集するように
    • 異なるラベルの標本はなる
  • 書きくだすとSDPになる
    • 劣勾配法と固有値分解を繰り返していく
    • 固有値分解は何だ?と思ったけど、固有値が入っている行列Γの負のところを0に置き換えて半正定値に無理やりするという感じだった

混合分布モデルによる逐次更新型異常検知

  • いわゆる混合モデルのEM推定かと思って飛ばそうかと思ったけど、異常検知の設定に合わせるために古い観測点の重みは小さくするというものが入っていた
  • しかし、そうすると重み更新のときに(十分統計量だけでなく)全サンプルを持っておく必要があって、これは大変
  • 重み係数を(妥当そうな)特殊な形にすると、更新時にサンプルを覚えておく必要がなくなってよい
    • 更新式も元のEM推定の雰囲気が残っていてシンプルなままでいい感じに見える

サポートベクトルデータ記述法による異常検知

  • いわゆる1クラスSVM。正例のみから学習するやつかと勘違いしていたけど、完全に教師なしの設定だった
  • ある程度マージンを許した状態で全データがなるべく超球の中に入るように、というのがobjective
    • そのままだと大変なので、SVMと同じく双対問題にしてから解く
  • カーネルで非線形性ができるが、変換後の超球がどんな形になるか想像しにくいということもあって、あまりオススメではない雰囲気で書かれていたように感じる

ガウス過程回帰による異常検知

  • ガウス過程は関数の事前分布や事後分布を考えることができて、予測毎に予測分散等が動的に変わる性質を持っている
    • この値を越えたら異常!みたいな感じじゃなくて、値がでかくても分散が小さくて予測に自信があるやつは異常と見なさない、ということができる
  • 実験計画法への応用(応答局面法)が特に面白かった
    • 自動車の衝突実験のようにコストがかかるシミュレーションをなるべく少ない回数でやりたい
      • ここを変えれば改善が大きそう、というのを実験前に知りたい
    • ガウス過程回帰を逆に使ってやる。期待改善量が大きなものを探して次のシミュレーションで調べる
    • ガウス過程で予測分布が計算できるので、それを利用して点ごとの期待値計算に使ってる

参考

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

Visualizing and Understanding Curriculum Learning for Long Short-Term Memory Networksを読んだ

機械学習

Curriculum Learning(簡単なやつから学習して、難しいのは後のほうがうまく行きそう)の方法をLSTMで試してみた報告っぽい内容。要約は以下の通り。

  • One-Pass CurriculumとBaby Steps Curriculumの2種類があるけど、Baby Steps Curriculumのほうがお勧めできる
  • シャッフルなどに比べるとCurriculum LearningはHidden Unitの数が少なくても安定して性能が出ている
  • 学習データが多いとどれもあまり変わらないが、学習データが少ないときほどCurriculum Learningは有効に働く

Curriculum Learning

学習するときは簡単なやつから学習して、難しいのは後のほうがうまく行きそうじゃん?というアイディアがベースにある。今回の場合はLSTMでどうこうやるので、系列系のタスクで簡単とか難しいは単純に系列の長さが短かければ簡単、長ければ難しい、という感じ。細かい設定で以下の2種類がある。

One-Pass Curriculum

  • データセットを難しさによってk個のバケット(D1, D2, ..., Dk)に分割する
  • 最初は一番簡単なデータ集合D1のみで学習させる
  • 収束したらその結果を元にD2のみ(=D1は捨てる)を使って学習
  • これを繰り返してDkまで学習させる
  • 論文ではdevsetを使ってearly stopさせる場合もあるとか

Baby Steps Curriculum

One-Pass Curriculumと大分似ているが、簡単なデータを途中で捨てないというのが違い。

  • データセットを難しさによってk個のバケット(D1, D2, ..., Dk)に分割する
  • 最初は一番簡単なデータ集合D1のみで学習させる
  • 収束したらその結果を元にD1 + D2を使って学習
  • これを繰り返してD1 + D2 + ... + Dkまで学習させる

実験

Digit Sum

  • {0,1,...,9}の系列が与えられたときに、その和をLSTMで出させる
  • LSTMのパラメータの設定とかは変えずに学習させる順番を主にいじる
    • No-CL: 完全にシャッフル
    • Sorted: ランダムではなく難易度順に並べる(バケットにはわかれていない)
    • Baby Steps Curriculum
    • One-Pass Curriculum
  • Baby Steps CurriculumとNo-CLはまぁまぁできてそう
  • One-Pass Curriculumは長いやつはそこそこできてるけど、短かい系列だと全然ダメ
  • Curriculum LearningはHidden Unitの数が少なくても安定して性能が出ている

Sentiment Analysis

  • 単語の列が与えられて、単語毎に1-5の極性(ポジティブ、ネガティブ)を付与していくタスク
  • Curriculum Learningがこの例でもよいが、conjunction(接続詞)が入っている難しい事例では特に性能がよい
  • 学習データが多いとどれもあまり変わらないが、学習データが少ないときほどCurriculum Learningは有効に働く
    • 下の図。論文より引用

f:id:syou6162:20161202195038p:plain

参考

ロードバランサとリバースプロキシ

Web インフラ

サービスの構成要素の資料を眺めていて、ロードバランサとリバースプロキシがあんま分かってないなと思ったので、[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)を見ながら軽く勉強したのでメモ。4月の導入研修直後にもこの本に目を通した記憶があるけど、半年以上仕事でやってから読むと前より大分分かる感じになっていた。しかし、まだまだ理解は足りていない。

というのをつぶやいたところISUCONをオススメされたので、過去問を解きながらロードバランサとリバースプロキシの効果を実感したい。

Webサーバーの冗長化

  • 複数台のサーバーに処理を分散させてサイトのスケーラビティを上昇させる方法 => 負荷分散(load balance)

DNSラウンドロビン

  • DNSを使って1つのサービス複数台のサーバーを分散させる
  • 同じ名前に複数のレコードを登録すると問い合わせの度に異なる結果が変わる => 比較的簡単に負荷分散できる
  • 均等に分散されるとは限らないなどのデメリットも大きい

IPVSでロードバランサ

  • L4スイッチとL7スイッチの2種類が大きく分けてある
    • L4スイッチ(TCPヘッダなどのプロトコルヘッダの内容を見る)はIPアドレスやポート番号で分散させられる。普通はこちらを指すことが多い
    • L7スイッチ(アプリケーション層の中身まで解析する)はリクエストされたURLによって分散先のサーバーを指定できる。AWSのELBとかはこれ
  • IPVS: IP Virtual Server
    • L4スイッチ相当。L7スイッチとしては利用できない
    • ipvsadmやkeepalivedなどが代表的なソフトウェア
    • どういう風に分散させるかのアルゴリズムを持ってる
    • ヘルスチェックとかもしてくれる
  • ロードバランサ自体も冗長化したい

リバースプロキシ

  • ロードバランサを入れるとWebサーバーの負荷分散はできるようになったが、Webサーバはクライアントに直接応答する
    • ロードバランサとWebサーバーの間にリバースプロキシを入れるとより柔軟な負荷分散が可能になる
  • ipアドレスによる制御、user agentによる制御などもできる。urlの書き換えてcooooooolなURLにしたりできる
  • 静的コンテンツ(画像とか)と動的コンテンツの見る先を振り分けることで、メモリ使用量の効率化(Keep-Aliveとか)もできる
    • user agentからbotを判断してキャッシュサーバーを見に行かせるなど
  • nginxやApache(+ mod_proxyなど)など

キャッシュサーバー

  • HTTPはステートレスなプロトコルのため、プロトコルのレベルでキャッシュの機能がある
  • Varnish、Squidキャッシュサーバー
    • クライアントとサーバーの間でHTTPのキャッシュができるときに使える
    • htmlファイルやcss、javascript、画像などの静的なコンテンツに大して非常に効率よくキャッシュできる
    • 状態を持っているやつは苦手(例: アカウント名が入ってるとか)
  • memcachedによるキャッシュ
    • VarnishやSquidが苦手なやつをどうにかできる
    • アプリケーションが内部で利用する粒度でキャッシュできる
    • htmlの断片とか配列とかそういうのをキャッシュさせるのによい

参考

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

  • 作者: 安井真伸,横川和哉,ひろせまさあき,伊藤直也,田中慎司,勝見祐己
  • 出版社/メーカー: 技術評論社
  • 発売日: 2008/08/07
  • メディア: 単行本(ソフトカバー)
  • 購入: 133人 クリック: 2,270回
  • この商品を含むブログ (289件) を見る

Playフレームワークをさくっと勉強する

Scala

仕事でPlayフレームワークを使っている。これまで自分が使ったことがあるフレームワークは

  • sinatra
  • scalatra
  • compojure(clojure)
  • ridge(社内のPerlのフレームワーク)

などでごつい(?)フレームワークを使ったことがなかったため、慣れるのに苦戦していた。分からなかったらググればいいかと思っていたけれど、色々分からないところも多かったため、ちょっと本を読んで全体像を掴もうとしたのでメモ。厚い本は読む前に力尽きるなと思ったので、以下の軽めの本を読んだ。

Guide to Play2 Scala

Guide to Play2 Scala

コントローラー周り

参考

ビュー周り

  • templateだけど型があるのでちょっと安心
  • 基本的な処理の流れ
    • Actionの実行
    • データをテンプレートへ渡す
    • テンプレートオブジェクトが作成される
    • HTMLがクライアントに返される
  • テンプレートの書き方は普通な感じ
    • includeもできる
  • play.api.data.Formを使うとformとobjectのbindが簡単にできる
    • オブジェクト側でapply/unapplyを用意する
  • mapping関数は複雑なvalidationをさせることもできる

参考

モデル周り

  • playはRDBMSのスキーマの変更をトラッキングしてくれる機能を持っている
    • Evolutionsスクリプト
    • [感想]便利だけど、勝手にやられるの嫌な感じもする...
  • conf/evolutions/defaultディレクトリにスクリプトを保存。連番で付けていく
  • こんな感じで書く
# --- !Ups
create table foo (
  id int(10) not null auto_increment, 
  name varchar(100),
primary key(id));
alter table bar add newColumn varchar(10);
 
# --- !Downs
drop table foo;
alter table bar drop newColumn;
  • # --- !Upsはスキーマの変更内容を記述
  • # --- !Downsは、Ups部分の変更を元に戻すための内容
  • http://localhost:9000にアクセスして、webからボタンをポチポチしていくとSQLが実行されていく...

参考

Emacsでscalaを書く

Emacs Scala

IntelliJ IDEAへの不満

ここ一ヶ月と少し、IntelliJ IDEAでscalaのコードを書いた。IntelliJ IDEAでscalaのコードを書くのは多分メジャーで、設定をあまり頑張らなくても型の表示や補完をしてくれる。scalaに慣れていない人にとってはありがたいサポートだが、慣れてくると不満が出てくる。例えば以下のようなことだ(書いていて思うけど、完全に老害っぽい感じだ)。

  • emacsキーバインド「っぽく」するアドオンがあるが、「っぽく」であって完全にemacsキーバインドというわけではないので、あれがないこれがないという状態になる
    • キーバインドを追加すればできるようになるが、無限にあるような気分がして、安心できない
  • git grepの結果をエディタでそのまま開くのは非常によく使うので、エディタの中からさくっと引けるようにしておきたいが、helm-git-grepのようなことができない
    • helmやanythingっぽいインターフェイスがないのは辛い
  • terminalとIDEAを行ったりきたりする必要があるが、terminalだけで完結しないため何度もアプリケーションを切り替えないといけない
    • emacs -nwで起動して、iTerm2をCtrl-iで常に呼び出せるようにしていたので、IDEAのためにアプリケーションの切り替えをするのはダルすぎた...
    • IDEAの呼び出しにホットキーを割り当ててみたが、いいキーの数は限られている
    • gitのcommitはmagitが最高なので、結局emacsは開かないといけない

コードが書けないといった致命的なものではないが、小さいことも積もってくると不満になってくる。

ensimeの導入

IDEAを捨ててEmacsにすぐ戻ればいいのだが、IDEAのような型の情報の補完は非常に強力だったので、そう簡単にEmacsに戻ってこれなかった。Emacsでもscalaのコードの型を表示するensimeというツールがあって、これに頼ることにした。同僚のid:shiba_yu36さんが導入記事を書いていたので、それを真似した。

小さいscalaプロジェクトだと使い慣れたemacsの環境で型情報の恩恵を受けることができて快適だったが、今やっている仕事のコードサイズだと補完に2-3秒くらいかかってたまにemacsが固まる状況であった。そのため、しばらくemacsとIDEAを行ったり来たりしていたが、auto-completeでの補完を我慢するとEmacsでもそれなりにscalaが書けるようになった(補完はできないが、symbolの型をminibufferに出したり、定義元にすぐ行けるといった必要なことはできる)。これで何とか生きていける...。

使っているキーバインド

色々あるけど、普段使うのはそんなに種類が多くないのでメモっておく。

キーバインド 意味
M-. 定義元にジャンプ
M-, ジャンプする前の位置に戻る
C-c C-c c 現在のファイルを型チェック
C-c C-c c 現在のファイルを型チェック
C-c C-v t カーソル位置のsymbolの型をminibufferに表示
M-n 現在のバッファで次のcompilation noteにジャンプ
M-p 現在のバッファで前のcompilation noteにジャンプ

余談

最近の若者はEmacsじゃなくてAtomを使うらしいので、この際Atomに乗り換えようとしましたが、あえなく失敗した。手がEmacsに侵食されている。

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Google機械翻訳の仕組み&できるようになったこと/まだ難しいことについて、社内の機械学習勉強会で説明します

機械学習

社内の機械学習勉強会で最近話題になった機械学習関連のエントリを取り上げているのですが、ここ一ヶ月ではGoogle Neural Machine Translation(GNMT)がとても話題になっていました。GNMTで使われているEncoder-Decoderやattentionのような仕組みを直近で使う予定は特にはないですが、機械学習を使うエンジニアとして知っておいて損はないし、技術的に何が変わったことにより何ができるようになって、何はまだできないのかを知ろう、というのが目的です。技術的な項目は興味ない人も多そうなので、最後に持っていきました。

Google Neural Machine Translation(GNMT)の最近の進化について

後述するようにまだまだ問題はあるけど、体感的に変化がありました。GNMTが公開された3日後くらいにはMSも翻訳をNMTにしていて、業界の変化の速さに青ざめました...。特に流暢性が上がったようです。

できるようになったこと

定量的な評価

Googleの論文から引用しますが、これまでの機械翻訳のシステム(Phrase-Based MT)と人手評価で比較すると、かなり改善しているのが分かります(0(complete nonsense)から6(perfect translation)で高いほうがいい翻訳を表わしている)。日本語⇔英語だとChinese⇔Englishと近い進化なのかな...?

f:id:syou6162:20161123213515p:plain

まだまだ難しいこと

  • 同じ単語を吐きまくる。GMTならではの問題といえそう。なぜこういうことが起きるかは技術的詳細のところを見てください

  • 数字や固有名詞をアグレッシブに変えてくる

  • GNMTに限らないけど、tokenizerの問題。形態素解析まではまとめてやっていない様子

  • 主語が落ちている文の翻訳。主語を補完するとうまくできるようにはなる
    • 語順はそれほど問題にならなくなってきたというのはすごい

技術的な詳細

ここからが本題。より詳しく知りたい方は以下のarXivに上がっている論文を見るのが適切かと思います。今回はおおざっぱに知りたかったので、NMTの仕組みを段階的に説明しているこちらのブログを参考にしました。

Encoder-decoder

  • RNN: 現在の入力とこれまでの履歴から次の出力を決めるモデル
    • 単語はword2vecのような技術を使って低次元の密ベクトルに埋め込む
  • LSTM: RNNは学習時に勾配消失問題があったが、Forget Gateなど導入することによりこれを回避
  • Encoder-decoderモデル: RNNの最後の出力を隠れ状態Sとして保持。SとNULLからDecoderを走らせて、1つ目の単語と次の隠れ状態を生成。それら2つを入力とし、さらに次の単語と次の隠れ状態を生成というのを繰り返す。EOS(文末記号)がくるまでこれを繰り返す
    • NMTが同じ単語を吐きまくる原因はこの辺からきてる?
    • decoderで吐くのは低次元密ベクトル。低頻度語や未知語はこのベクトルがきちんと学習されていないため、固有名詞が書き変わるような問題が起こる
  • Encoder-decoder 翻訳 (TISハンズオン資料)

Encoder-decoderモデルの問題点としては、文長が長くなるにつれて後ろの履歴を表現するベクトルが怪しくなり、精度がどんどん落ちてしまうという問題がありました。

Attention based encoder-decoder

文長が長くなったときに、次に訳するのは元文のどこに注目(attention)すればいいかを陽に取り込んだのが、Attention based encoder-decoderです。図は論文より引用。

f:id:syou6162:20161123210551p:plain

単語のインデックス毎にencoderの出力がありますが、それを重み付きで足し合わせることにより、どの単語を重視するべきかという情報をdecoder側は取り込むことができます。この重みは出力結果を解析する際にも訳に立ち、どの単語がどの単語に(ソフトに)訳出されているかが分かるというメリットがあります。図は再び論文より引用。

f:id:syou6162:20161123210936p:plain

Bi-directional encoder layer

Encoder-decoderモデルは文を左から右に見る(Forward方向)ことにより文全体を表現するような隠れベクトルSを作っていました。文末に近いencoderの出力は文頭の情報を取り込むことはできますが、文頭のencoderの出力では文末の情報を取り込むことはできません。この問題を解決するためにLSTMで文を右から左になめていき(Backword方向)、2つの隠れベクトル(+attention)でdecoderを走らせればよさそうです。この方法は両方向からやるので、Bi-directional encoderと呼ばれます。attention + Bi-directional (+ビームサーチ)により、文長が長くなっても精度はあまり下がらず翻訳できるようになってきました。図は再び論文より引用。

f:id:syou6162:20161123212051p:plain

"The deep is for deep learning"

いわゆるdeepにするアレです。encoder側に8層、decoder側に8層と積むことによって実現されているようです。その他、residual等々ありますが、おおざっぱに説明するにはこの辺でいいかなと思うので、終わります(疲れた)。

感想

これまでの自然言語処理の基礎技術(係り受け解析や固有表現抽出、照応解析、言語モデルなど)は翻訳に代表される応用技術で役に立つ!ということで頑張ってきた部分が大きかったと思いますが(私も談話構造解析を少しやっていたので...)、応用側がencoder decoderのようなend2endで現実的に解かれるようになると自然言語処理でこれまで作られてきたエコシステムがうまく回らなくなる部分も出てくるのかなと思うところもありました。

自然言語処理の基本と技術

自然言語処理の基本と技術