Transformer TTS
딥러닝 논문정리

Transformer TTS

[4]Transformer TTS

[Transformer 전체 구조]

1)CNN이나 RNN없이 어텐션 만으로 모든게 다능하다.

2)input과 output의 디펜던시가 글로벌하다. ***

CNN은 지역적, RNN은 멀수록 흐려진다.

3)병렬화가 잘된다.

4)reduced effective resolution(단점):

보안책: 어텐션을 하나가 아니라 여러개를 쓰려고 한다.

트랜스포머 공부 사이트: illustrated-transformer(설명), annotated transformer(소스코드)

 

[Transformer의 동작 방식]

Encoder로 여러 블럭을 쌓는다.

최상위 인코더에서 나오는 임베딩이 디코더의 모든 레이어로 가고, 그 값을 받아서 위로 propogate하게 된다. autoregressive한 방식이다.

[Encoder구조]

논문에는 총 6개의 인코더가 있다.

1번 서브레이어: 멀티 헤드 어텐션 사용

2번 서브레이어: position-wise FC(MLP)

Residual connection + layer norm

LayerNorm(x + sublayer(x))가 들어간다.

모든 서브레이어에서 히든 디멘젼은 D(model) = 512

512 dimension의 벡터가 그만큼 들어간다.

grapheme의 개수 만큼 512 dimension의 백터가 들어간다.

입력이 들어갈때 positional encoding이라는게 더해진다.

 

[전체적인 동작 방식][Encoder 동작 방식]

각 단어 별로 포지셔널 인코딩이 만들어진다. phoneme이나 grapheme 단위로 들어간다.

그 위에 self-attention이 들어가고, residual connection이 동작한다. layernorm이 동작한다.

인코더는 병렬적으로 동작이 가능하다. 입력 문장 전체가 다 있다면, 그 문장으로 부터 한번에 병렬처리를 해서 propogate을 한다.

 

[Decoder 동작 방식]

디코더도 인코더와 비슷한 구조를 가짐.

Masked-Multihead-self-attention과 feed-forward network을 가진다.

멀티헤드 셀프 어텐션: 디코더 아래로 부터 받은것을 처리한다.

위에 멀티 헤드 어텐션: 인코더에서 오는 정보를 어텐션 처리후 받아들인다.

두 정보를 결합해서 feed-forward로 보낸다.

Masked self-attention은 현재로 부터 시작해서 오른쪽 정보는 없고, 왼쪽으로만 weight이 들어있는걸 masked attention이라고 한다. 과거의 정보는 보지만, 미래의 정보는 못본다.

디코더가 인코더의 정보를 가져올때 3개의 값을 가져온다.

그 3개의 정보가 key, value, query이다.

query는 자기 밑에서 부터 오는 정보로 부터 만들어지고, query와 key랑 매칭을 시켜서, weighted sum을 만들고 그걸로 weighted sum을 해주는 방법이다.

 

[Attention]

Q K V를 사용한다.

Q는 query이다.

K는 key이다.

V는 value이다.

Q와 K를 반영해서 weighted을 결정하고, value와 weighted sum을 해서 값을 출력한다.

밑에 입력을 받으면, linear transform을 한다. 그리고 두개의 백터를 dot product를 한다.

만약 두개의 vector의 방향이 비슷하면, dot product의 값이 크게 나온다. 이걸 하면 두개의 벡터의 방향성을 비교 할 수 있다.

보통 K와 Q는 여러개의 벡터로 구성된 matrix로 되어있다. 즉 matmul을 이용해서 실제 dot product를 계산한다.

그다음 그 결과를 스케일 한다. dimension크기에 좀 독립적인것을 한다. 그렇다면 루트 길이를 가지고 normalize를 한다. 이 부분이 바로 scaled dot product가 된다. softmax를 하면 다 더해서 1이 된다. 그리고 곱하기 v를 하고 최종값을 밷어낸다.

 

Multi-head attention이라는걸 적용한다.

헤드를 여러개 쓰는데, 헤드가 같으면 안되기 때문에, QKV가 달라지게 만들어야 한다. 이 방법은 linear transform을 VKQ의 input에 각각 적용시킨다. 예를들어 head가 8개라면 linear transfrom은 8개씩 있는 것이다.

각각 다른 W를 곱해주면, 다 다른 벡터스페이스로 변환되게 된다. 이렇게 만들어서 서로 다른 정보를 표현하게 만 든다. 각 스페이스 별로 계산된 어텐션 값, 전부 따로 따로 계산을 한다. 8개가 나오면 전부 concat을 시킨다.

linear transform을 이게 통과하면, 최종적인 multi-head attention이 된다.

어탠션은 다양하게 사용된다.

예1)encoder의 값을 decoder에서 가져오면, K와 V는 인코더에서 가져오고, Q는 디코더에서 가져온다.

예2) self-attention 은 Q뿐만 아니라, K와 V자체도 자기 밑에 레이어에서 올라오게 하는 것이다.

즉 인코더에서 인코더 또는 디코더에서 디코더로 가게 하는 것이다.

인코더와 디코더 내부의 값도, QKV 3가지로 분리를 해서, 그 값을 이처럼 어텐션 구조로 바꾸면, 주변을 잘 살피고 자기의 값을 잘 정하게 적용이 된다. 이런 셀프 어텐션이 잘 적용이 된다.

 

트랜스 포머에서의 3가지 어텐션:

 

그 이후 들어가는 Feed forward sublayer는 xw+b에 relu의 형태로 만들어 진다.

 

Transformer의 문제:

입력정보에 포지션 정보를 반영할 수 있는게 없다.

상대적인 위치 정보가 전혀 들어가지 않아서, 아주 먼 곳에서도 큰 값을 받을 수도 있다.

order of sequence를 사용해서 positionla encoding을 사용한다.

위치 자체를 특징에 넣는다.

sine과 cos을 이용한다. 아무리 큰거여도 계산이 가능해서 확장성이 좋다.

PE는 두가지 정보를 가지고 계산을 한다.

feature vector가 512 dimension이라면, 이게 몇번째 정보인지도 같이 들어간다.

0,2, 4는 sin 1,3,5는 cos을 사용한다.

pos/어떤 숫자를 하면, 주기를 늘리거나 줄여주게 된다.

i즉 position embedding의 차원은 주기를 결정하는데 사용이된다.

self-attention이 훨씬 더 빠르다는 장점이 있다.

 

[Transformer TTS]

 

[Transformer TTS의 전체적인 구조]

Vocoder는 WaveNet Vocoder를 사용했다.

mel-spectrogram을 이용해서 사용한다.

text에서 phoneme으로 바꾸는 converter를 그냥 하나 만들어서 붙였다.

기존의 tts는 그냥 text를 바로 입력했을때는 발음이 잘못나오는 경우가 있었다.

Text-to-phoneme converter를 별로도 붙여서 잘못된 발음을 고쳤다.

T2P(G2P)는 룰베이스 방식을 사용했다.

 

Phoneme embedding은 512D이고, trainable하다.

 

Positional encoding을 scale했다는 점이 가장 다른점이다.

이게 필요한건, 디코더는 음성정보가 올라가고, 인코더는 텍스트가 올라가기 때문에 같은 포지션 임베딩을 사용하면 안된다. 알파라는 값을 이용해서 각각에 맞게 결정되게 만들었다. 알파는 학습을 통해서 알아 갈 수있게 만들었다.

 

[네트워크 구조]인코더

의 pre-net은 non-linear transform이다.

conv.(512 channel) + BN + ReLU + dropout + linear projection의 조합으로 만들어 졌다.

디코더

프리넷은 auto-regressive이기 때문에 만들어진 스팩토그램이 들어간다.

Key는 텍스트에서 뽑은거고, Q는 스팩토 그램에서 뽑은 것이다.

두개를 비교하기 위해 성질이 좀 비슷하게 맞춰주는 것이 디코더 프리넷의 역할이다.

mel-spectrogram이 phoneme embedding과 호환할 수 있게 만든다.

실제로는 2FC layer와 ReLU로 만들어 진다.

Encoder와 Decoder는 멀티헤드 어텐션을 이용해서 만들어 진다.

 

디코더 뒷부분

:

최종적으로 layant 벡터들이 나오고 이걸 linear projection을 하면, Mel linear가 만들어 진다.

반대로 가는게 있는게 그게 stop linear이다. 역할은 적정하게 음성이 나오면 끝내야 하는 포인트를 찾아야 한다. 어느정도 신호가 나오면 멈춰라 라고 하는것이 stop layer이다.

Post-net은 위에서 나온 mel-spectrogram을 개선 시켜주는 역할을 한다.

 

결과: 스피드는 훨씬더 빠르다. 그리고 fidelity도 좀더 좋아졌다.

 

 

 

 

 

'딥러닝 논문정리' 카테고리의 다른 글

FastSpeech1, 2  (0) 2021.07.08
[3]Encoder-Decoder TTS_2  (0) 2021.07.08
[2]Encoder-Decoder TTS_1  (0) 2021.07.08
[1]Introduction to Speech Preprocessing  (0) 2021.07.08
ResNet 논문정리  (0) 2021.05.11