Вопрос или проблема
Я читал статья Wav2Vec 2.0 и пытался понять архитектуру модели, но у меня возникли трудности с пониманием того, как сырьевые аудиовходы переменной длины могут быть поданы в модель, особенно от свёрточного кодировщика признаков к контекстной сети трансформеров.
Во время тонкой настройки (по тому, что я читал) даже несмотря на то, что сырьевые аудиовходы внутри пакета будут дополнены до длины самого длинного входа в пакете, длина входов может различаться между пакетами. Это подразумевает, что выход от свёрточного кодировщика признаков будет иметь переменные длины между пакетами.
Тем не менее, контекстная сеть трансформеров имеет фиксированное измерение входа; базовая модель Wav2Vec 2.0 использует трансформер с модельным измерением 768. Это означает, что выход от свёрточного кодировщика признаков каким-то образом должен быть “манипулирован”, чтобы стать размером 768, чтобы подать его в трансформер.
Как происходит эта “манипуляция”? Модель Wav2Vec от HuggingFace (см. ниже) показала, что между свёрточным кодировщиком признаков (также известным как Wav2Vec2FeatureExtractor) и контекстной сетью трансформеров (также известной как Wav2Vec2Encoder) есть слой Wav2Vec2FeatureProjection. Этот слой Wav2Vec2FeatureProjection содержит линейный слой, который принимает вход размером 512 и выводит размером 768. Как определяется размер входа 512, если сырьевые входы могут иметь переменные длины между пакетами?
Wav2Vec2ForCTC(
(wav2vec2): Wav2Vec2Model(
(feature_extractor): Wav2Vec2FeatureExtractor(
(conv_layers): ModuleList(
...
(6): Wav2Vec2NoLayerNormConvLayer(
(conv): Conv1d(512, 512, kernel_size=(2,), stride=(2,), bias=False)
)
)
)
(feature_projection): Wav2Vec2FeatureProjection(
(layer_norm): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
(projection): Linear(in_features=512, out_features=768, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(encoder): Wav2Vec2Encoder(
(pos_conv_embed): Wav2Vec2PositionalConvEmbedding(
(conv): Conv1d(768, 768, kernel_size=(128,), stride=(1,), padding=(64,), groups=16)
(padding): Wav2Vec2SamePadLayer()
)
...
Ключевым моментом является то, что вектор размером 768 элементов для трансформера соответствует размеру одного входа… позвольте объяснить.
- Вы начинаете с сырьевого аудиовхода переменной длины
- Он передаётся через временную сеть CNN, которая выдаст вам выходы, названные $z_1$ до $z_T$ согласно статье – где T переменна между пакетами и соответствует количеству временных шагов в определённом аудиовходе (различным для разных аудиовходов).
- Каждый из этих $z$ передаётся как векторы размером 768 элементов в трансформер, то есть передаётся $T$ векторов размером 768 в ваш трансформер
Как вы можете представить, практически вам также нужно будет передать маску в трансформер, чтобы он знал, что переменная $T$ обозначает для различных входов в вашем пакете.
Ответ или решение
Wav2Vec 2.0 представляет собой мощную архитектуру для обработки аудиоданных, включая детали передачи информации между различными компонентами модели, такими как Конволюционный Функциональный Эмиттер (Convolutional Feature Encoder) и Трансформерный Контекстный Сеть (Transformer Context Network). Оно оптимизировано для работы с переменной длиной входных аудиосигналов, что создает множество уникальных вызовов при обработке данных. Давайте глубже разберемся в реализации этого процесса.
Входные данные и Конволюционный Функциональный Эмиттер
Сначала рассмотрим, как модель Wav2Vec 2.0 обрабатывает начальные аудиосигналы. На входе модели находятся сырые аудиоданные переменной длины. Эти данные проходят через несколько уровней свертки (Conv Layers), представляя собой временные сверточные сети. Каждый временной шаг может быть обозначен как ( z_1, z_2, \ldots, z_T ), где ( T ) — количество временных шагов для конкретного аудиосигнала в батче. Тем не менее, поскольку длина аудиосигналов варьируется, значение ( T ) может быть различным для разных аудиофайлов.
Переход к Трансформерному Контекстному Сети
Как вы верно заметили, выходные данные из Конволюционного Функционального Эмиттера имеют переменную длину, что затрудняет их прямую передачу в Трансформерный Контекстный Сеть, который требует фиксированных входных данных. Однако, Wav2Vec 2.0 использует слой проекции, именуемый Wav2Vec2FeatureProjection, для этой конкретной задачи.
Что такое Wav2Vec2FeatureProjection?
Wav2Vec2FeatureProjection представляет собой линейный слой, который принимает векторы с размерностью 512 и преобразует их в векторы размерности 768.
Вопрос о том, откуда берется размерность 512, вытекает из самого Конволюционного Функционального Эмиттера. После прохождения через свертки, выходы каждого временного шага ( z_t ) имеют фиксированное количество признаков — в данном случае 512. Это предопределено архитектурой сети, где количество фильтров в последнем слое свертки равно 512. Таким образом, даже если длина аудиосигнала варьируется, выходные вектора всегда имеют одну и ту же размерность по признакам.
Преобразование и маскирование
После того как выходные векторы размерности 512 проходят через линейный слой, они преобразуются в векторы размерности 768. Затем, эти преобразованные векторы, по количеству равные времени ( T ) (то есть ( z_1′, z_2′, …, z_T’ ) с размерностью 768), передаются в Трансформерный Контекстный Сеть.
Важно отметить, что поскольку входы могут иметь различную длину, необходимо использовать технику маскирования для управления тем, как трансформер обращается с переменной длиной входа. С помощью маски, трансформер может игнорировать позиции, которые не соответствуют значимым временным шагам, обеспечивая таким образом эффективность и корректность обработки, и справляясь с различиями в длине входных данных по батчам.
Заключение
В целом, архитектура Wav2Vec 2.0 демонстрирует эффективное решение для обработки аудиоданных переменной длины. С помощью Конволюционного Функционального Эмиттера и слоя проекции Wav2Vec2FeatureProjection, модель адаптируется к различным входным данным, преобразовывая их в формат, пригодный для работы с превращенным контекстом в Трансформерном Контекстном Сети. Интеграция маскирования позволяет модели поддерживать высокую производительность при обработке многоканальных временных данных.