はじめに
この記事では音声認識モデルによく用いられるCTCに関して簡単にまとめています。読みにくい部分や間違いなどあるかもしれません。ご容赦ください。
CTCとは
CTCはend2endモデルに分類される。音声認識などでよく用いられている印象がある。
\begin{align}
x&: 入力系列\\
y_t^k&:フレームtにおける出力のうちノードkの値\\
l&: トークン系列\\
\pi&: アライメント系列
\end{align}
CTCを用いて行いたいことは$x$から$y$を予測することである。ただしCTCモデルは直接$y$を出力するのではなく、$x$を入力して$\pi$を出力し、$\pi$を次の1,2の順に実行することで$y$を得る。
- 連続して出現している同一トークンを削除する。
- ブランクトークン"-"を削除する。
例えば $\pi=[-,o,o,-,o,i,i,i]$ は $y=[o,o,i]$ に変換される。
具体例
教材には抽象的な表現しかなかったのでこのページでは具体例を紹介します。
以下のように記号を設定する。
\begin{align}
x&: 音声波形[x_0,...,x_7]\\
y_t^k&:フレームtに対応する音素がkである確率(k=a,u,-)\\
l&: ターゲットテキスト[a,u]\\
\pi&: アライメント[-,a,u],[a,a,u],[a,-,u],[a,u,u],[a,u,-]
\end{align}
$x$が「会う」と認識される確率は
\begin{align}
&\quad P([a,u]|x)\\
&=P([-,a,u]|x)+P([a,a,u]|x)+P([a,-,u]|x)+P([a,u,u]|x)+P([a,u,-]|x)\\
&=y_-^0 y_a^1 y_u^2+y_a^0 y_a^1 y_u^2+y_a^0 y_-^1 y_u^2+y_a^0 y_u^1 y_u^2+y_a^0 y_u^1 y_-^2
\end{align}
とあらわされる。
ここで、$y_a^1$に対する$L_{CTC}$の勾配を求めると
\begin{align}
&\quad\frac{\partial L_{CTC}}{\partial y_a^1}\\
&=-\frac{1}{P([a,u]|x)}\frac{\partial}{\partial y_a^1}P([a,u]|x)\\
&=-\frac{1}{P([a,u]|x)}(y_-^0 y_u^2+y_a^0 y_u^2)\\
&=-\frac{1}{P([a,u]|x)\cdot y_a^1}(y_-^0 y_a^1 y_u^2+y_a^0 y_a^1 y_u^2)\\
&=-\frac{1}{P([a,u]|x)\cdot y_a^1}P(l=[a,u],\pi_1=a|x)
\end{align}
となる。同様にして他のパラメータに対する勾配も求められる。
参考文献
- 高島遼一, Pythonで学ぶ音声認識, インプレス社, 2021.