Conformer
)최근 연구들은 convolution과 self-attention을 합치는 것이 이것들을 각각 사용하는 것 보다 더 성능이 좋다는 것을 보여주고 있다.
해당 연구에서는, ASR 모델들에서 self-attention과 convolution을 어떻게 유기적으로 합칠수 있는가에 대해 연구했다.
⇒ 결론적으로, 한쌍의 feed forward 모듈 사이에 샌드위치처럼 끼인 self-attention과 convolution의 새로운 조합을 소개한다.
Conformer는 LibriSpeech에서 SOTA를 달성했고, testother dataset에 대해 외부 언어 모델을 사용한 경우, 이전에 가장 좋은 성능을 낸 Transformer Transducer보다 15% 상대적인 개선을 이루었다.
conformer의 오디오 인코더는 첫째로 input을 convolution subsampling layer로 처리한 후, 여러 conformer block으로 처리한다.
Conformer의 특별한 점은 Transformer block들 대신 Conformer block을 사용한다는 것이다.
conformer block은 함께 쌓여있는 4개의 모듈
로 이루어져 있다.
Conformer의 Multi-headed self-attention(MHSA)은 Transformer-XL로부터 Relative positional encoding
을 적용
Relative sinusoidal positional encoding: 절대적인 위치가 아닌, 상대적인 위치를 통해 정보를 인코딩하는 방식
self-attention module이 서로 다른 input length에 대해 일반화를 더 잘하도록 한다.
또한 relative positional encoding을 사용하는 encoder는 발화 길이의 변화에 더 강하다(robust)
relative positional encoding
positional encoding
은 왜 필요한가?
철수
/ 가 / 영희 / 를 / 좋아해”라는 시퀀스와 “영희 / 가 / 철수
/ 를 / 좋아해”라는 시퀀스에서 철수
에 해당하는 attention layer의 아웃풋은 두 문장에서 완벽하게 동일하다. 이러한 문제를 해결하기 위해 2017년에 발표된 Transformer 논문에서는 인풋에 위치 인코딩 (position encoding)을 더해주는 방법을 사용`relative positional encodig`은 왜 필요한가?
그럼, relative positional encoding은 어떤 식으로 사용이 되는가?
각 토큰은 여러개의 PE를 갖는다.
나 자신과 다른 토큰들 간의 관계(거리)를 나타내기 위해서
절대 순서(absolute position)를 인코딩하지 않고, 각 토큰이 다른 토큰에 대한 위치 관계를 인코딩한다.
어떻게 각 토큰은 전체 토큰 수만큼의 relative positional encoding을 갖는가?
를 예시로 들면,
이걸 ~토큰에 대해 반복
Relative posional embedding ⇒ 내가 이든, 이든 동일하다. (얼마나 떨어 졌는지만 신경쓰기 때문 (단위: 홉 이라고 하나봅니다..!)
여기에서 학습 해야할 positional embedding은 총 9개! (나올 수 있는 위치 임베딩의 범위가 ~ 이기 때문)
⇒ 위 그림에서 각 토큰 별로 표시된 위치 임베딩을 각각 한줄로 세워보면 아래처럼 된다!
그리고 각 벡터는 하나의 토큰과 다른 토큰 사이의 관계(위치 거리)에서 비롯되기 때문에 아래처럼 쌍 별 표기법을 사용할 수 있다(pair-wise notation)
또한 에서 가 2인 경우, 같은 해당 positional embedding은 같은 값을 갖는다.
그러나 만큼 있는 positional embedding을 어떻게 처리해야할까?
⇒ 각 토큰마다 가지고 있는 총 토큰 개수만큼의 pe를 다 더해서 토큰과 곱하는 것은….. 토큰이 가진 semantic meaning에 혼동을 가져올 것.
⇒ 그렇다면, self-attention으로 연산하기!
그럼, Relative PE의 장점과 특징
Self-Attention with Relative Position Representative
논문에서는 텍스트로만 실험을 했지만, 텍스트가 아닌 요소 간에 pair relative 관계가 있는 모든 그래프 표현에 이 방법을 적용할 수 있다.학습을 원활하게 하기 위해 앞단에 Layernorm
을 적용하고, dropout
을 통해 정규화를 해주었다.
convolution module은 gating 매커니즘으로 시작한다.
point-wise conv
Point-wise Convolution의 filter의 크기는 1x1으로 고정되어 있기때문에 1 x 1 Convolution이라고도 불립니다.
channel들에 대한 연산만 수행하므로, output의 크기는 변하지 않고 channel의 수를 조절 할 수 있는 역할을 하게 됩니다.
보통 dimensional reduction을 위해 많이 쓰입니다. 이 것은 channel의 수를 줄이는 것을 의미하는데, 추후의 연산량을 많이 줄여줄 수 있어 중요한 역할을 하게 됩니다.
Glu Activation
class GLU(nn.Module):
"""
The gating mechanism is called Gated Linear Units (GLU), which was first introduced for natural language processing
in the paper “Language Modeling with Gated Convolutional Networks”
"""
def __init__(self, dim: int) -> None:
super(GLU, self).__init__()
self.dim = dim
def forward(self, inputs: Tensor) -> Tensor:
outputs, gate = **inputs.chunk(2, dim=self.dim)**
return **outputs * gate.sigmoid()**
Depth-wise Convolution
Depth-wise convolution은 Standard convolution이 각 채널만의 spatial feature(공간적 특징)를 추출하는것이 불가능하기 때문에 고안해낸 방법이라고 할 수 있습니다.
그렇다면 당연히 Depth-wise conv에서 하려고 하는것은 각 channel마다의 spatial feature를 추출하는 것입니다.
따라서 여기서는 각 channel마다 filter가 존재하게 되고, 이러한 특징때문에 input과 output의 channel이 같게됩니다.
Swish activation
Swish
, 또 다른 연구에서는 SiLU
로 불린다sigmoid에 입력값 를 한 번 더 곱해주는 모습
ReLU와 비교했을 때 음수 부분에서 좀 더 완만한 모습을 보인다.
class Swish(nn.Module):
"""
Swish is a smooth, non-monotonic function that consistently matches or outperforms ReLU on deep networks applied
to a variety of challenging domains such as Image classification and Machine translation.
"""
def __init__(self):
super(Swish, self).__init__()
def forward(self, inputs: Tensor) -> Tensor:
return **inputs * inputs.sigmoid()**
Conformer 구조
샌드위치 구조 (Macaron-Net)에서 영감
Transformer 블럭에 있는 original Feed Forward Layer를 two-half-step
Feed-forward layers로 대체
Macaron-net처럼 half-step residual weights in FFN
사용.
두번째 feed forward module 뒤에 마지막 layernorm 레이어가 뒤따른다.
수식으로 확인해보면,
sandwich structure
음성 인식에서는 self-attention module 후에 convolution module을 쌓는 것이 더 좋다는 것을 발견.
Conformer에서 도입한 요소들 중 어떤 것이 가장 성능에 영향을 많이 미쳤는지 확인하기 위해 하나씩 빼가면서 Ablation study 실시