Это второй день моего участия в ноябрьском испытании обновлений, подробности о мероприятии:Вызов последнего обновления 2021 г.
1 Обзор
Tacotron2 — это фреймворк сквозного синтеза речи, предложенный Google Brain в 2017 году. Модель можно рассматривать как состоящую из двух частей снизу вверх:
- Сеть прогнозирования спектра: сеть кодировщик-внимание-декодер для прогнозирования входной последовательности символов как последовательности кадров спектра Мел.
- вокодер: модифицированная версия WaveNet для генерации сигналов во временной области из предсказанных последовательностей мел-спектральных кадров.
2 энкодера
Ввод кодировщика - это несколько предложений, и основной единицей каждого предложения является символ, например
- Английский «hello world» будет разделен на «h e l low w o r l d» в качестве ввода.
- Китайский «привет, мир» сначала идентифицирует пиньинь, чтобы получить «ni hao shi jie», а затем разделяет его на «nih ao sh ij ie» в соответствии с согласными и гласными или напрямую разделяет его на «nihaoshijie». аналогично английскому"
Конкретный процесс Encoder:
- Измерение входных данных
[batch_size, char_seq_length]
- Используя 512-мерное встраивание символов, сопоставьте каждый символ с 512-мерным вектором, и выходное измерение будет
[batch_size, char_seq_length, 512]
- 3 одномерные свертки, каждая свертка включает 512 ядер, размер каждого ядра 5*1 (то есть каждый раз просматривается 5 символов). После каждой свертки выполняются BatchNorm, ReLU и Dropout. Выходной размер
[batch_size, char_seq_length, 512]
(Для обеспечения неизменности размерности каждой свертки используется прокладка) - Вывод, полученный выше, бросьтеОднослойный BiLSTM, размер скрытого слоя равен 256, так как это двунаправленный LSTM, окончательный выходной размер равен
[batch_size, char_seq_length, 512]
3 Механизм внимания
На приведенном выше рисунке показаны вход и выход первого внимания. в,является начальным вводом PreNet<S>
кодированное представление,является текущим «контекстом внимания». На начальном первом шагеиинициализируются вектором со всеми нулями, тогдаиКонкатенация для получения 768-мерного вектора, вектор используется в качестве входных данных LSTMcell вместе с вниманием_скрытым и вниманием_ячейки (внимание_скрытый на самом деле является скрытым_состоянием LSTMcell, а внимание_ячейка на самом деле является состоянием ячейки LSTMcell). Полученный результатИ внимание_ячейка, здесь нет отдельного имени для внимания_ячейки, в основном с учетом того, что это "соевый соус", потому что кроме внимания_рнн, внимание_ячейка больше нигде не используется
Attention_Layer принимает всего пять входных данных:
- - переменная, связанная со спектром mel
- Функции, извлеченные из исходной последовательности символов через слой кодировщика
- даПосле прохождения линейного
- Attention_weights_cat получается путем сращивания исторических (последний момент)
- Маска вся фальшивая, в принципе бесполезна
Детали расчета следующие:
Основная часть — это get_alignment_energies, которая вводит позиционные функции внутри этой функции, поэтому онаГибридный механизм внимания
Гибридный механизм внимания на самом деле является комбинацией механизма внимания содержания (регулярное внимание) и механизму позиционного внимания:
в,скрытое состояние предыдущего декодера,вес предыдущего внимания,первыйскрытое состояние кодировщика. добавить к нему смещение, итоговая функция оценки рассчитывается следующим образом:
в,,,,ипараметры для обучения,это предыдущий вес вниманияПризнак местоположения, полученный путем свертки,
Механизм внимания Tancotron2 в основном такой же, как гибридный механизм внимания, но он немного отличается.
в,Смещение для текущего скрытого состояния декодера, а не для предыдущего шагаИнициализирован до 0, функция местоположениясовокупный вес вниманияСвертка происходит от:
Функция get_alignment_energies показана следующим образом:
4 декодера
Декодер представляет собой авторегрессионную структуру, которая предсказывает спектрограмму из закодированной входной последовательности, по одному кадру за раз.
- Спектр, предсказанный на предыдущем шаге, сначала передается в PreNet, который содержит два слоя нейронных сетей PreNet выступает в роли информационного узкого места (узкого места), необходимого для обучения вниманию.
- Выходные данные PreNet объединяются с вектором контекста внимания и передаются в двухуровневый LSTM с 1024 единицами. Выходные данные LSTM снова объединяются с вектором контекста внимания, а затем подвергаются линейной проекции для прогнозирования целевого спектра.
- Наконец, целевой спектральный кадр проходит через 5-уровневую свертку PostNet (сеть постобработки), а затем вывод добавляется к выводу Linear Projection (остаточное соединение) в качестве окончательного вывода.
- С другой стороны, выходные данные LSTM объединяются вместе с вектором контекста внимания, проецируются в скаляр, а затем передаются сигмовидной функции активации, чтобы предсказать, была ли предсказана выходная последовательность.
Схема и код уровня PreNet следующие:
class LinearNorm(torch.nn.Module):
def __init__(self, in_dim, out_dim, bias=True, w_init_gain='linear'):
super(LinearNorm, self).__init__()
self.linear_layer = torch.nn.Linear(in_dim, out_dim, bias=bias)
torch.nn.init.xavier_uniform_(
self.linear_layer.weight,
gain=torch.nn.init.calculate_gain(w_init_gain))
def forward(self, x):
return self.linear_layer(x)
class Prenet(nn.Module):
def __init__(self, in_dim, sizes):
super(Prenet, self).__init__()
in_sizes = [in_dim] + sizes[:-1]
self.layers = nn.ModuleList(
[LinearNorm(in_size, out_size, bias=False)
for (in_size, out_size) in zip(in_sizes, sizes)])
def forward(self, x):
for linear in self.layers:
x = F.dropout(F.relu(linear(x)), p=0.5, training=True)
return x
Иллюстрация слоя PostNet показана ниже:
Из приведенной ниже части инициализации декодера видно, что декодер состоит из prenet,attention_rnn,Attention_layer,decoder_rnn, linear_projection, gate_layer.