【論文紹介】Dial2vec 最高の対話埋め込みを求めて

# 紹介する論文
【筆者】Che Liu, Rui Wang, Junfeng Jiang, Yongbin Li, Fei Huang. 
【タイトル】[Dial2vec: Self-Guided Contrastive Learning of Unsupervised Dialogue Embeddings](https://arxiv.org/abs/2210.15332).
【採択会議】EMLP2022 Main Conference.

# どんな論文？
多くの研究では対話履歴全てを事前学習済みのBERTに突っ込むことで対話全体のベクトルを計算しています．
しかし，BERTは事前学習の段階で対話タスクに最適化されておらず，共参照などの話者同士の相互作用関係を無視してしまっています．
そこで[Dial2vec: Self-Guided Contrastive Learning of Unsupervised Dialogue Embeddings](https://arxiv.org/abs/2210.15332)では話者同士の相互作用を考慮した対話埋め込みの獲得手法Dial2vecを提案し，多くのタスクでかなりの差をつけてSOTA(State of the Art)を達成しました．

# 技術的なポイント
こちらが対話埋め込みを取得するためのモデルの全体図です．
全体を見ると少し複雑そうですが，基本的には **「話者Aの対話履歴埋め込みを，相互作用を考慮した対話履歴と近づける」** ように学習するということを行っているだけなので，式を見つつ理解していきましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/08ba4166-061d-8a58-fe94-5ee5c88ee18b.png)

## Encoding Module
図の左側のEncoding Moduleでは対話履歴全体をまずエンコードします．
こちらは話者IDや発話IDなどのスペシャルトークンを付与した状態でそのままPLATOモデル（Baiduが開発したSeq2seqの応答生成モデル）のエンコーダによってエンコードするらしいです．

## Contrastive Learning
次に対照学習を行うための正例ペアを作成します．
Encoderから出力された対話履歴全体の埋め込み$E$を用いて，以下の式によって各話者ごとの対話履歴ベクトルに分割します．

```math
\hat{E}^{p1}=E\odot(m^{p1})^T \\
\hat{E}^{p2}=E\odot(m^{p2})^T
```

ここで$m^{p1}$と$m^{p2}$は各話者の発話部分のみが1，それ以外が0となるベクトルと定義されており，その転置行列とのアダマール積を計算します．
つまり，全体の対話履歴に対して相手の話者の発話にマスクをして，各話者ごとのベクトルを抽出しています．

次に相手の対話履歴ベクトルとの相互作用を考慮したベクトルを作るために，互いの対話履歴ベクトルを転置した行列との行列積を以下のように計算します．

```math
C^{p1}=\hat{E}^{p2}(E^{p1})^T \\
C^{p2}=\hat{E}^{p1}(E^{p2})^T
```

これにより相互作用を考慮したベクトル$C^{p1}$と$C^{p2}$が得られますが，このままでは相手の発話情報に寄りすぎてしまうのと，対照学習の際に不都合があるので，もう一度，以下のように行列積を計算します．

```math
\tilde{E^{p1}}=C^{p1}E^{p1} \\
\tilde{E^{p2}}=C^{p2}E^{p2}
```

こうした一連の計算によって， **話者$p2$の発話情報を考慮した話者$p1$の対話履歴ベクトル$\tilde{E^{p1}}$** が得られました．（逆もまた然り）

次に上記の対話履歴のベクトルを用いて対照学習の損失を計算します．
損失自体は対照学習でよく使われるものをこの研究でも採用しています．

```math
l=-\sum_{r=1}^R\log{\frac{e^{sim(\hat{E}^{pr},\tilde{E^{pr}})}/τ}{\sum_{j=1}^N e^{sim(\hat{E}^{pr}_j,\tilde{E^{pr}_j})}/τ}}
```

ここで正例ペアは「話者rの元の対話履歴のベクトル$\hat{E}^{p1}$ vs 同じ話者rの相互作用を考慮した対話履歴のベクトル$\tilde{E^{p1}}$」となります．
つまり，片方の話者の対話履歴の埋め込みを，相互作用を考慮した対話履歴のベクトルに近づけるように学習を行うことで，片方の話者の対話履歴埋め込みに情報を集約します．

## 対話履歴埋め込みの獲得
この研究では最終的な対話履歴埋め込みを獲得するための手法を2つ提案しています．
というのも，この研究では **対話履歴全体の埋め込み** を使用することと， **各話者に関する対話履歴埋め込み** を用いる場合の2つを想定しているためです．

### 対話履歴全体の埋め込み
エンコーダによって全体の対話履歴をエンコードして得られた埋め込み$E$に対してMean Poolongをしたものです．

### 各話者に関する対話履歴埋め込み
各話者に関する対話履歴埋め込みを計算するために，以下の式を用います．

```math
e=\sum_{r=1}^R\frac{\sum_{i=1}^n m^{pr}_i\mathbf{h}_i}{\sum_{i=1}^n m^{pr}_i}
```

ここで$m$はマスクであり，相手の話者の発話を隠した対話履歴，つまり各話者に関する対話履歴が獲得できます．

# 実験
対話履歴埋め込みの有効性を証明するために，いくつかのタスクで実験を行ないました．
検証したタスクは，以下のとおりです．
* Domain Categorization
    * 対話データセットに対して，各手法でエンコードした対話埋め込みをクラスタリングする(K-means)
    * 各データセットごとに割り振られたドメイン数でクラスタリングを行って，その正解率で評価
* Semantic Relatedness
    * 対話データセット中でランダムに抽出した2つの対話間のコサイン類似度を計算
    * 対話履歴同士は同じドメイン内にあるかどうかで2値の教師ラベルを持つ
    * コサイン類似度によってソートした類似度と教師ラベル間のスピアマン順位相関係数を計算して評価
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/92afdb81-d9f6-5db3-68da-c83b2a9001fa.png)

* Dialogue Retrieval
    * 対話をクエリとして各対話履歴に対するコサイン類似度を計算
    * 作成したランキングをMAPで評価
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842766/4bcd0e7b-08ec-f85b-e127-fd4df870411e.png)

どのタスクにおいて大幅に性能が向上しており，提案手法による対話履歴埋め込みの有効性が分かります．

# まとめ
手法自体の実装は比較的容易に見えるため，今後の記事でもしかしたら再現実装して日本語の事前学習済みモデルで検証した結果を載せるかもしれません．
研究室内のページにこういった論文の解説のストックがかなりあるので，どんどん放出して行きたいと思います．
ここまで御覧いただきありがとうございました．