<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deep Learning on Matias Di Bernardo</title><link>https://dibernardo.netlify.app/es/categories/deep-learning/</link><description>Recent content in Deep Learning on Matias Di Bernardo</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>Matías Di Bernardo</copyright><lastBuildDate>Mon, 24 Mar 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://dibernardo.netlify.app/es/categories/deep-learning/index.xml" rel="self" type="application/rss+xml"/><item><title>IA Generativa, Flow Matching y TTS</title><link>https://dibernardo.netlify.app/es/p/ia-generativa-flow-matching-y-tts/</link><pubDate>Mon, 24 Mar 2025 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/es/p/ia-generativa-flow-matching-y-tts/</guid><description>&lt;img src="https://dibernardo.netlify.app/p/generative-ai-flow-matching-and-tts/front2.PNG" alt="Featured image of post IA Generativa, Flow Matching y TTS" />&lt;p>En &lt;em>Intercambios Transorgánicos&lt;/em>, trabajamos continuamente con modelos de &lt;em>Deep Learning&lt;/em> de última generación. Para ello, nos mantenemos en constante aprendizaje sobre los desarrollos más recientes en el campo. En esta presentación, el objetivo fue explicar los fundamentos del modelo &lt;em>F5-TTS&lt;/em>, un sistema de síntesis de voz de vanguardia. Durante el desarrollo, se introdujo el concepto de inteligencia artificial generativa y los modelos de flujo (&lt;em>flow-based models&lt;/em>), dado que &lt;em>F5-TTS&lt;/em> se basa en esta técnica. El propósito es compartir este conocimiento con el equipo y con cualquier persona interesada en iniciarse en los modelos de conversión de texto a voz (&lt;em>Text-to-Speech&lt;/em>).&lt;/p>
&lt;h2 id="introducción---ia-generativa-y-tts">Introducción - IA Generativa y TTS
&lt;/h2>&lt;p>La estructura de la clase se organizó de la siguiente manera:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Introducción a los modelos de TTS&lt;/strong>: Se describen los diferentes modelos utilizados, sus principales características y las razones por las cuales se decidió cambiar de enfoque.&lt;/li>
&lt;li>&lt;strong>Evolución de los modelos TTS&lt;/strong>: Se presenta un gráfico basado en encuestas que muestra la evolución de diversas tecnologías de TTS.&lt;/li>
&lt;li>&lt;strong>Cambio de paradigma en modelos de lenguaje&lt;/strong>: Se explica cómo el uso de grandes volúmenes de datos ha permitido una mejor generalización en modelos de lenguaje.&lt;/li>
&lt;li>&lt;strong>Ejemplo de generalización&lt;/strong>: Se presentan casos ilustrativos, como la generación de una imagen de un astronauta montando un caballo, ejemplos de audio y síntesis de acentos específicos (ej., un hablante cordobés enojado).&lt;/li>
&lt;li>&lt;strong>Cambio en la estructuración de conjuntos de datos&lt;/strong>:
&lt;ul>
&lt;li>&lt;strong>Enfoque tradicional&lt;/strong>: Uso de un único hablante de alta calidad con gran cantidad de datos (modelo entrenado para cada hablante).&lt;/li>
&lt;li>&lt;strong>Enfoque actual y futuro&lt;/strong>: Uso de conjuntos de datos diversos con etiquetas que permiten entrenar modelos capaces de entender el concepto del habla y generalizar en múltiples tareas (ejemplos extraídos de &lt;em>VoiceBox&lt;/em>).&lt;/li>
&lt;li>&lt;strong>Costo computacional&lt;/strong>: Se menciona el aumento en el tamaño de los modelos y la dificultad de su entrenamiento, similar a los modelos de lenguaje a gran escala (&lt;em>LLMs&lt;/em>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Explicación de IA Generativa&lt;/strong>:
&lt;ul>
&lt;li>Introducción a los modelos generativos y el concepto de distribución subyacente.&lt;/li>
&lt;li>Explicación sobre &lt;em>Transformers&lt;/em> y su función en la clasificación con contexto. Se aclara que aunque los &lt;em>Transformers&lt;/em> son modelos &lt;em>Non-Autoregressive&lt;/em> (NAR) en entrenamiento, en inferencia funcionan de manera &lt;em>Autoregressive&lt;/em> (AR).&lt;/li>
&lt;li>Diferencia entre modelos de clasificación y modelos generativos basados en reducción de dimensionalidad y variables latentes.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="modelos-de-tts-voicebox-e2-y-f5">Modelos de TTS: VoiceBox, E2 y F5
&lt;/h2>&lt;p>Esta sección detalla los principales avances en modelos de TTS que han llevado al desarrollo de &lt;em>F5-TTS&lt;/em>.&lt;/p>
&lt;h3 id="1-voicebox-tts---in-context-learning">1. VoiceBox TTS - &lt;em>In Context Learning&lt;/em>
&lt;/h3>&lt;p>Se introduce la arquitectura inicial de &lt;em>VoiceBox&lt;/em>, cuyo objetivo principal es la generalización mediante &lt;em>In Context Learning&lt;/em>. Este enfoque permite al modelo inferir información a partir de ejemplos previos. Para lograrlo, se le proporciona un fragmento de audio con una parte oculta, forzando al modelo a completarla de manera coherente.&lt;/p>
&lt;blockquote>
&lt;p>&lt;em>&amp;ldquo;We show that Voicebox’s text-guided speech infilling approach is much more scalable in terms of data while subsuming many common speech generative tasks.&amp;rdquo;&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>Este método, introducido por Meta en &lt;em>VoiceBox&lt;/em>, marca un cambio de paradigma al demostrar que los modelos de TTS pueden beneficiarse de técnicas previamente utilizadas en modelos de lenguaje e imagen.&lt;/p>
&lt;p>No obstante, el modelo aún depende de técnicas clásicas en TTS, como el predictor de duración de fonemas y el &lt;em>Forced Alignment&lt;/em> para mapear fonemas a espectrogramas de Mel, ya que la longitud de estos no coincide con la de los tokens de texto.&lt;/p>
&lt;h3 id="2-e2-tts---filler-tokens">2. E2 TTS - &lt;em>Filler Tokens&lt;/em>
&lt;/h3>&lt;p>&lt;em>E2 TTS&lt;/em> simplifica varias de las decisiones arquitectónicas de &lt;em>VoiceBox&lt;/em>, especialmente en lo referente a la longitud de los espectrogramas de Mel y el texto. En lugar de utilizar alineación forzada, introduce los &lt;em>Filler Tokens&lt;/em>, que permiten igualar la dimensión entre texto y audio de manera más sencilla. Esta estrategia facilita que el modelo aprenda la asociación temporal entre ambos elementos.&lt;/p>
&lt;p>Otro cambio significativo es que el modelo trabaja directamente con texto en lugar de fonemas. Aunque esto podría parecer una desventaja (dado que palabras homógrafas pueden tener pronunciaciones diferentes), el contexto provee suficiente información para inferir la pronunciación adecuada, de manera similar al procesamiento del lenguaje natural en humanos.&lt;/p>
&lt;h3 id="3-f5-tts---open-source">3. F5 TTS - &lt;em>Open Source&lt;/em>
&lt;/h3>&lt;p>Si bien &lt;em>E2 TTS&lt;/em> representa un avance importante, su entrenamiento es lento debido a la necesidad de inferir asociaciones previamente guiadas. &lt;em>F5 TTS&lt;/em> optimiza el modelo anterior con las siguientes mejoras:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Uso de ConvNeXt&lt;/strong>: Mejora el procesamiento del texto de entrada.&lt;/li>
&lt;li>&lt;strong>Cambio de arquitectura&lt;/strong>: Sustitución de la red &lt;em>U-Net&lt;/em> por &lt;em>DiT&lt;/em> (&lt;em>Diffusion Transformer&lt;/em>).&lt;/li>
&lt;li>&lt;strong>Sway Sampling&lt;/strong>: Optimización en el proceso de inferencia.&lt;/li>
&lt;/ul>
&lt;p>Además, &lt;em>F5 TTS&lt;/em> es de código abierto, lo que facilita su adopción y mejora por parte de la comunidad.&lt;/p>
&lt;h2 id="flow-matching---fundamentos-teóricos">Flow Matching - Fundamentos Teóricos
&lt;/h2>&lt;p>Para comprender el funcionamiento de &lt;em>F5-TTS&lt;/em>, es necesario revisar los modelos en los que se basa, conocidos como &lt;em>Flow Matching Models&lt;/em>. Estos modelos han evolucionado a partir de técnicas previas en modelado de distribuciones probabilísticas.&lt;/p>
&lt;h3 id="1-normalizing-flow">1. Normalizing Flow
&lt;/h3>&lt;p>Los &lt;em>Normalizing Flows&lt;/em> son una familia de modelos probabilísticos que transforman una distribución simple en una más compleja mediante una serie de funciones invertibles y diferenciables. Se utilizan para modelar distribuciones de datos de alta dimensión y generar muestras realistas con un control preciso sobre la probabilidad.&lt;/p>
&lt;h3 id="2-residual-flow">2. Residual Flow
&lt;/h3>&lt;p>Los &lt;em>Residual Flows&lt;/em> extienden los &lt;em>Normalizing Flows&lt;/em> al permitir transformaciones más flexibles sin necesidad de cumplir estrictamente con la condición de invertibilidad. Esto se logra mediante redes residuales que aproximan las funciones de transformación sin restricciones de estructura.&lt;/p>
&lt;h3 id="3-continuous-normalizing-flows-cnf">3. Continuous Normalizing Flows (CNF)
&lt;/h3>&lt;p>Los &lt;em>Continuous Normalizing Flows&lt;/em> reformulan los &lt;em>Normalizing Flows&lt;/em> en términos de ecuaciones diferenciales ordinarias (ODEs). En lugar de aplicar transformaciones discretas en pasos sucesivos, estos modelos aprenden una dinámica continua en el espacio latente, lo que permite una mayor expresividad y eficiencia computacional.&lt;/p>
&lt;h3 id="4-flow-matching">4. Flow Matching
&lt;/h3>&lt;p>&lt;em>Flow Matching&lt;/em> es una técnica que optimiza la transformación de una distribución de referencia a una distribución objetivo utilizando un enfoque basado en la minimización de una función de costo específica. Se diferencia de los enfoques anteriores al no requerir el cálculo explícito de la función de densidad, lo que lo hace especialmente útil para modelos generativos de gran escala, como &lt;em>F5-TTS&lt;/em>.&lt;/p>
&lt;h2 id="grabación-de-la-presentación">Grabación de la presentación
&lt;/h2>&lt;p>Cada sección detalla en este artículo se explica en profundidad en la presentación:&lt;/p>
&lt;div class="video-wrapper">
&lt;iframe loading="lazy"
src="https://www.youtube.com/embed/YIpvFC41NUw"
allowfullscreen
title="YouTube Video"
>
&lt;/iframe>
&lt;/div></description></item><item><title>Efecto de algorítmos de reducción de rudio en sistemas de TTS</title><link>https://dibernardo.netlify.app/es/p/efecto-de-algor%C3%ADtmos-de-reducci%C3%B3n-de-rudio-en-sistemas-de-tts/</link><pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/es/p/efecto-de-algor%C3%ADtmos-de-reducci%C3%B3n-de-rudio-en-sistemas-de-tts/</guid><description>&lt;p>Este estudio se realizó en el contexto de la clase &lt;em>Laboratorio de Acústica&lt;/em> en la UNTREF. Elegí este tema porque está alineado con investigaciones que he estado desarrollando como parte del grupo &lt;em>Intercambios Transorgánicos&lt;/em>. La consigna para el trabajo de clase consistió en realizar un estudio subjetivo utilizando una encuesta para explorar la relación entre variables objetivas y subjetivas.&lt;/p>
&lt;p>En mi grupo de investigación, he estado investigando cómo los algoritmos de reducción de ruido afectan a los sistemas de síntesis de voz (TTS) entrenados con grabaciones de baja calidad. El enfoque está en el español rioplatense, un acento regional con datos de alta calidad limitados. En este contexto, fue natural combinar ambas tareas y realizar una prueba subjetiva sobre el impacto de los algoritmos de reducción de ruido en los sistemas TTS.&lt;/p>
&lt;h2 id="resumen">Resumen
&lt;/h2>&lt;p>Los puntos clave de esta investigación son:&lt;/p>
&lt;ul>
&lt;li>Evaluación de tres algoritmos de reducción de ruido: Wave U-Net, HiFi-GAN y DeepFilterNet.&lt;/li>
&lt;li>Uso de métricas subjetivas (CMOS) y objetivas (PESQ, STOI, MCD).&lt;/li>
&lt;li>Ideas sobre el desarrollo de modelos TTS eficientes en recursos para acentos poco representados.&lt;/li>
&lt;/ul>
&lt;h2 id="metodología">Metodología
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Algoritmos&lt;/strong>: Wave U-Net, HiFi-GAN y DeepFilterNet evaluados con el modelo TTS FastPitch.&lt;/li>
&lt;li>&lt;strong>Conjunto de datos&lt;/strong>: Subconjunto de la colección ArchiVoz (15 minutos de audio con ruido).&lt;/li>
&lt;li>&lt;strong>Pruebas&lt;/strong>: Prueba subjetiva CMOS y métricas objetivas (PESQ, STOI, MCD).&lt;/li>
&lt;li>&lt;strong>Participantes&lt;/strong>: 24 respuestas válidas, incluyendo tanto expertos como no expertos.&lt;/li>
&lt;/ul>
&lt;h2 id="principales-hallazgos">Principales Hallazgos
&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Rendimiento de DeepFilterNet&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Obtuvo la puntuación CMOS más alta, reflejando la mejor calidad subjetiva.&lt;/li>
&lt;li>Mostró mejoras significativas en la salida TTS a pesar de las correlaciones mixtas con las métricas objetivas.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Análisis de Métricas Objetivas&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>PESQ y MCD mostraron una correlación limitada con las preferencias subjetivas.&lt;/li>
&lt;li>Las puntuaciones STOI fueron consistentes entre los algoritmos, indicando inteligibilidad preservada.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Comparación de Algoritmos&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DeepFilterNet&lt;/strong>: Evaluaciones subjetivas superiores, MCD moderado.&lt;/li>
&lt;li>&lt;strong>Demucs&lt;/strong>: Comparable a DeepFilterNet en PESQ, pero con puntuaciones subjetivas inferiores.&lt;/li>
&lt;li>&lt;strong>Wave U-Net&lt;/strong>: Bajo rendimiento tanto subjetivo como objetivo.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Experiencia de los Participantes&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>No se observaron diferencias significativas entre las evaluaciones subjetivas de expertos y no expertos.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="implicaciones">Implicaciones
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Eficiencia&lt;/strong>: Métodos avanzados de reducción de ruido como DeepFilterNet pueden mejorar los sistemas TTS sin necesidad de grabaciones de alta calidad.&lt;/li>
&lt;li>&lt;strong>Limitaciones&lt;/strong>: Las métricas objetivas como PESQ y MCD no son indicadores suficientes por sí solas de la calidad subjetiva en TTS.&lt;/li>
&lt;li>&lt;strong>Trabajo Futuro&lt;/strong>:
&lt;ul>
&lt;li>Ampliar los conjuntos de datos y niveles de ruido para un análisis más robusto.&lt;/li>
&lt;li>Explorar sistemas TTS entrenados conjuntamente con algoritmos de reducción de ruido.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="conclusiones">Conclusiones
&lt;/h2>&lt;p>Este trabajo concluye que el preprocesamiento con DeepFilterNet mejora significativamente el rendimiento de los sistemas TTS, con un aumento de 1.1 en la puntuación CMOS. Estos hallazgos destacan la importancia de la selección de algoritmos para optimizar sistemas TTS con pocos recursos. Además, adquirí valiosos conocimientos sobre evaluaciones subjetivas y el análisis estadístico necesario para extraer conclusiones significativas de los datos.&lt;/p>
&lt;p>Toda la información de este estudio se encuentra en el &lt;a class="link" href="https://drive.google.com/file/d/1F4aJGIU9FX2LT8OFik-Yjg4uSz6T09jw/view?usp=sharing" target="_blank" rel="noopener"
>informe académico&lt;/a> (en inglés).&lt;/p></description></item><item><title>Entendiendo FastPitch y la arquitectura Transformers</title><link>https://dibernardo.netlify.app/es/p/entendiendo-fastpitch-y-la-arquitectura-transformers/</link><pubDate>Wed, 23 Aug 2023 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/es/p/entendiendo-fastpitch-y-la-arquitectura-transformers/</guid><description>&lt;img src="https://dibernardo.netlify.app/p/understanding-fastpitch-and-the-transformer-architecture/front.png" alt="Featured image of post Entendiendo FastPitch y la arquitectura Transformers" />&lt;p>Entender un modelo moderno de deep learning no es sencillo debido a la gran cantidad de conocimiento previo necesario y al rápido ritmo de avance en este campo. En el proyecto de investigación &lt;em>Intercambios Transorgánicos&lt;/em>, estamos trabajando con TTS, específicamente con el modelo FastPitch de Nvidia. He estudiado este modelo para ajustarlo (fine-tuning) al español y he compartido este proceso de investigación en una clase para ayudar a mis colegas del grupo de investigación a comprenderlo mejor.&lt;/p>
&lt;h2 id="entendiendo-los-modelos-seq2seq">Entendiendo los Modelos Seq2Seq
&lt;/h2>&lt;p>En &lt;em>Intercambios Transorgánicos&lt;/em> utilizábamos previamente Tacotron2 como modelo TTS. Este modelo funciona bien, pero presenta varios problemas, principalmente durante el entrenamiento y la inferencia, debido a su naturaleza auto-regresiva. En contraste, FastPitch es un modelo no auto-regresivo (NAR). Para entender estas diferencias, exploré en profundidad los modelos seq2seq, analizando su evolución a lo largo del tiempo, y realicé un resumen rápido de los modelos de análisis de secuencias más relevantes:&lt;/p>
&lt;ul>
&lt;li>RNN&lt;/li>
&lt;li>LSTM&lt;/li>
&lt;li>Transformers&lt;/li>
&lt;/ul>
&lt;p>Tacotron2 se basa en un modelo LSTM (AR), mientras que FastPitch utiliza Transformers (NAR). Comprender esta progresión tecnológica proporciona un contexto esencial, especialmente sobre los transformers, incluyendo la codificación posicional, un elemento clave para su naturaleza no auto-regresiva, y el mecanismo de atención.&lt;/p>
&lt;h2 id="la-arquitectura-transformer">La Arquitectura Transformer
&lt;/h2>&lt;p>Comencé estudiando la arquitectura transformer, ya que es fundamental para el modelo FastPitch. Revisé recursos en línea y el influyente artículo &lt;em>Attention is All You Need&lt;/em>. A continuación, algunos puntos clave que anoté durante mi estudio:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Mecanismo de Auto-Atención&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Propósito&lt;/strong>: Focalizar dinámicamente en diferentes partes de la secuencia de entrada.&lt;/li>
&lt;li>&lt;strong>Mecanismo&lt;/strong>:
&lt;ul>
&lt;li>Query (Q), Key (K), Value (V): Derivados de las embeddings de entrada.&lt;/li>
&lt;li>Los puntajes de atención se calculan como el producto punto de Q y K, escalado por la raíz cuadrada de la dimensión.&lt;/li>
&lt;li>Los puntajes se normalizan con softmax para generar pesos de atención.&lt;/li>
&lt;li>Se calcula una suma ponderada de V basada en estos pesos para producir la salida.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Atención Multi-Cabezal&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Propósito&lt;/strong>: Capturar diferentes relaciones entre tokens aplicando múltiples mecanismos de auto-atención en paralelo.&lt;/li>
&lt;li>&lt;strong>Mecanismo&lt;/strong>: Las salidas de las múltiples cabezas de atención se concatenan y se transforman linealmente.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Codificación Posicional&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Propósito&lt;/strong>: Añadir información sobre el orden de los tokens en la secuencia, compensando la falta de un concepto incorporado de orden secuencial en los Transformers (a diferencia de los RNNs).&lt;/li>
&lt;li>&lt;strong>Mecanismo&lt;/strong>: Se añade un vector fijo o aprendible a las embeddings de entrada.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Estructura Codificador-Descodificador&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Codificador&lt;/strong>: Procesa la secuencia de entrada en representaciones ricas en contexto.
&lt;ul>
&lt;li>Componentes:
&lt;ul>
&lt;li>Auto-atención multi-cabezal&lt;/li>
&lt;li>Red neuronal feed-forward (FFN)&lt;/li>
&lt;li>Normalización por capas y conexiones residuales&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Descodificador&lt;/strong>: Genera la secuencia de salida atendiendo tanto a las salidas del codificador como a los tokens generados previamente.
&lt;ul>
&lt;li>Componentes:
&lt;ul>
&lt;li>Auto-atención multi-cabezal enmascarada (evita atender a tokens futuros)&lt;/li>
&lt;li>Atención multi-cabezal sobre las salidas del codificador&lt;/li>
&lt;li>FFN, normalización por capas y conexiones residuales&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Red Feed-Forward (FFN)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Propósito&lt;/strong>: Introducir no linealidad y procesar cada token de manera independiente.&lt;/li>
&lt;li>&lt;strong>Mecanismo&lt;/strong>: Dos capas lineales con una activación ReLU entre ellas.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Normalización por Capas y Conexiones Residuales&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Propósito&lt;/strong>: Estabilizar el entrenamiento y mejorar el flujo de gradientes al normalizar las entradas de cada capa y añadir conexiones de salto.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="fastpitch">FastPitch
&lt;/h2>&lt;p>Con la teoría cubierta, examiné cada sección de la arquitectura de FastPitch en detalle. Ofrecí una breve explicación sobre las embeddings de palabras y la codificación posicional, ya que son temas complejos, y quise mantener la clase concisa.&lt;/p>
&lt;p>FastPitch convierte texto en espectrogramas mel, que luego son transformados en audio por otro modelo (en nuestro caso, HiFi-GAN). La secuencia de entrenamiento incluye los siguientes pasos:&lt;/p>
&lt;ol>
&lt;li>Texto a embeddings de palabras&lt;/li>
&lt;li>Concatenación de embeddings de palabras con espectrogramas mel&lt;/li>
&lt;li>Codificación posicional y FFT (bloque Transformer Feed-Forward)&lt;/li>
&lt;li>Predicción de tono&lt;/li>
&lt;li>Predicción de la duración de los fonemas&lt;/li>
&lt;li>Otro bloque FFT&lt;/li>
&lt;li>Capa completamente conectada&lt;/li>
&lt;li>Salida del espectrograma mel&lt;/li>
&lt;/ol>
&lt;p>En cada bloque, presenté las ecuaciones correspondientes y proporcioné explicaciones cualitativas sobre su rol en el modelo. Por ejemplo, la predicción de la duración de los fonemas es crucial para alinear la duración de un fonema con la duración esperada en el espectrograma.&lt;/p>
&lt;h2 id="clase-online">Clase Online
&lt;/h2>&lt;p>Finalmente, resumí los puntos más importantes y realicé una clase online para compartir estos conceptos con mis colegas. Puedes verla aquí:&lt;/p>
&lt;div class="video-wrapper">
&lt;iframe loading="lazy"
src="https://www.youtube.com/embed/v4bt8bGIM00"
allowfullscreen
title="YouTube Video"
>
&lt;/iframe>
&lt;/div></description></item><item><title>IA aprende a jugar 2048</title><link>https://dibernardo.netlify.app/es/p/ia-aprende-a-jugar-2048/</link><pubDate>Fri, 17 Feb 2023 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/es/p/ia-aprende-a-jugar-2048/</guid><description>&lt;img src="https://dibernardo.netlify.app/p/ai-learns-to-play-2048-game/game_img.jpg" alt="Featured image of post IA aprende a jugar 2048" />&lt;p>Usé este proyecto como introducción al Aprendizaje por Refuerzo (Reinforcement Learning). Habiendo trabajado principalmente con aprendizaje supervisado y no supervisado, quería comenzar con un proyecto pequeño y sencillo para comprender rápidamente las ideas principales y crear algo divertido. Seguí este &lt;a class="link" href="https://youtu.be/L8ypSXwyBds" target="_blank" rel="noopener"
>video de YouTube&lt;/a> como referencia, el cual explica cómo usar Aprendizaje por Refuerzo (RL) para entrenar un modelo capaz de jugar al juego de la serpiente. Para hacerlo más desafiante, apliqué la misma red al juego 2048.&lt;/p>
&lt;h2 id="código">Código
&lt;/h2>&lt;p>El código tiene tres componentes principales:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>El Juego&lt;/strong>: Implementa la lógica del juego y la interfaz gráfica (GUI).&lt;/li>
&lt;li>&lt;strong>Agente&lt;/strong>: Controla la jugabilidad.&lt;/li>
&lt;li>&lt;strong>Modelo de IA&lt;/strong>: Una red neuronal que aprende a jugar y guía al agente.&lt;/li>
&lt;/ul>
&lt;h3 id="estado-del-juego">Estado del Juego
&lt;/h3>&lt;p>Modelé el estado del juego como una matriz de 4x4 que representa el tablero. Las acciones del juego están representadas por un vector con las siguientes posibilidades:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Izquierda&lt;/strong>: [1, 0, 0, 0]&lt;/li>
&lt;li>&lt;strong>Derecha&lt;/strong>: [0, 1, 0, 0]&lt;/li>
&lt;li>&lt;strong>Arriba&lt;/strong>: [0, 0, 1, 0]&lt;/li>
&lt;li>&lt;strong>Abajo&lt;/strong>: [0, 0, 0, 1]&lt;/li>
&lt;/ul>
&lt;h3 id="recompensa">Recompensa
&lt;/h3>&lt;p>El modelo de RL funciona con recompensas para cuantificar cuándo el agente actúa bien o mal. Inicialmente, definí las siguientes recompensas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>+10 puntos&lt;/strong>: Cuando el agente duplica los puntos. Esto es crucial porque, en 2048, los puntos aumentan exponencialmente.&lt;/li>
&lt;li>&lt;strong>-10 puntos&lt;/strong>: Cuando se pierde el juego. Esto sirve como una penalización sencilla.&lt;/li>
&lt;/ul>
&lt;p>Al principio, el modelo mostraba una mejora lenta. Para solucionarlo, añadí una recompensa adicional:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>+2 puntos&lt;/strong>: Cuando se incrementan los puntos. Esta recompensa incentiva acciones que maximicen la limpieza del tablero y el progreso.&lt;/li>
&lt;/ul>
&lt;h2 id="cómo-funciona-el-modelo">Cómo Funciona el Modelo
&lt;/h2>&lt;p>El modelo es una red neuronal lineal simple. Toma el estado del juego como entrada y predice la mejor acción siguiente para maximizar la recompensa.&lt;/p>
&lt;p>Las recompensas se gestionan utilizando una técnica llamada Q-Learning. Un &lt;em>valor Q&lt;/em> representa la calidad de una decisión basada en la función de pérdida. La función de pérdida se deriva de la &lt;em>Ecuación de Bellman&lt;/em>:&lt;/p>
$$
NewQ(s, a) = Q(s, a) + \alpha [R(s, a) + \lambda \, \text{max}Q'(s', a') - Q(s, a)]
$$&lt;p>Donde:&lt;/p>
&lt;ul>
&lt;li>$Q(s, a)$: El &lt;em>valor Q&lt;/em> para un estado y acción específicos.&lt;/li>
&lt;li>$\alpha$: Tasa de aprendizaje.&lt;/li>
&lt;li>$R(s, a)$: Recompensa para un estado y acción específicos.&lt;/li>
&lt;li>$\lambda$: Tasa de descuento.&lt;/li>
&lt;li>$\text{max}Q&amp;rsquo;(s&amp;rsquo;, a&amp;rsquo;)$: Recompensa futura máxima esperada.&lt;/li>
&lt;/ul>
&lt;h2 id="experimentos-y-resultados">Experimentos y Resultados
&lt;/h2>&lt;h3 id="prueba-aleatoria-como-línea-base">Prueba Aleatoria como Línea Base
&lt;/h3>&lt;p>Para establecer una línea base, probé el puntaje promedio que se puede lograr tomando acciones aleatorias. Después de 1,000 iteraciones, el puntaje promedio fue de &lt;strong>170&lt;/strong>, muy por debajo de los 2048 puntos necesarios para ganar el juego.&lt;/p>
&lt;h3 id="resultados-iniciales">Resultados Iniciales
&lt;/h3>&lt;p>Mis primeros intentos fueron desalentadores. El modelo tenía un desempeño peor que los movimientos aleatorios. Aquí algunos resultados iniciales:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Juego 1,000&lt;/strong> | Puntaje: 208 | Récord: 416 | Puntaje Promedio: 200 | Recompensa: 640&lt;/li>
&lt;li>&lt;strong>Juego 1,000&lt;/strong> | Puntaje: 116 | Récord: 346 | Puntaje Promedio: 161 | Recompensa: 310&lt;/li>
&lt;li>&lt;strong>Juego 1,000&lt;/strong> | Puntaje: 112 | Récord: 348 | Puntaje Promedio: 146 | Recompensa: 320&lt;/li>
&lt;/ol>
&lt;p>En estos intentos, el agente desarrolló una estrategia subóptima de llenar el tablero antes de incrementar los puntos.&lt;/p>
&lt;h3 id="mejoras">Mejoras
&lt;/h3>&lt;p>Tras experimentar con los parámetros de recompensa, me centré en la fase de exploración. Inicialmente, el parámetro de &lt;em>juegos de exploración&lt;/em>, que elige movimientos aleatorios, estaba configurado en 25 juegos. Al aumentar este parámetro, el agente pudo explorar más estrategias, logrando mejores resultados:&lt;/p>
&lt;ol start="4">
&lt;li>&lt;strong>Juego 1,000&lt;/strong> | Puntaje: 478 | Récord: 478 | Puntaje Promedio: 230&lt;/li>
&lt;li>&lt;strong>Juego 1,000&lt;/strong> | Puntaje: 514 | Récord: 964 | Puntaje Promedio: 382&lt;/li>
&lt;/ol>
&lt;p>A medida que el modelo mejoraba, extendí el entrenamiento a más juegos:&lt;/p>
&lt;ol start="6">
&lt;li>&lt;strong>Juego 3,796&lt;/strong> | Puntaje: 770 | Récord: 1,366 | Puntaje Promedio: 469&lt;/li>
&lt;li>&lt;strong>Juego 4,852&lt;/strong> | Puntaje: 631 | Récord: 1,462 | Puntaje Promedio: 483&lt;/li>
&lt;/ol>
&lt;p>Finalmente, con 200 juegos de exploración y 5,000 juegos de entrenamiento, los resultados fueron los siguientes:&lt;/p>
&lt;ol start="8">
&lt;li>&lt;strong>Juego 5,000&lt;/strong> | Puntaje: 840 | Récord: 1,678 | Puntaje Promedio: 512&lt;/li>
&lt;/ol>
&lt;p>Aunque el modelo no logró ganar el juego, quedé satisfecho con el progreso. Creo que con más tiempo de entrenamiento (el último intento duró 4 horas) y capas adicionales en la red, sería posible ganar el juego con esta arquitectura.&lt;/p>
&lt;h2 id="demo">Demo
&lt;/h2>&lt;p>Aquí tienes una demostración de la aplicación, mostrando el proceso de aprendizaje del agente:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://player.vimeo.com/video/1045495533" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="vimeo video" webkitallowfullscreen mozallowfullscreen allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;p>Implementé atajos de teclado para controlar la velocidad del juego, ofreciendo tres opciones:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Rápida&lt;/strong>: Para un entrenamiento acelerado.&lt;/li>
&lt;li>&lt;strong>Lenta&lt;/strong>: Para observar y analizar el progreso del agente y sus errores.&lt;/li>
&lt;li>&lt;strong>Media&lt;/strong>: Casi no la utilicé.&lt;/li>
&lt;/ul>
&lt;p>El código completo para este proyecto está disponible en este &lt;a class="link" href="https://github.com/MatiasDiBernardo/RF_2048-game" target="_blank" rel="noopener"
>repositorio&lt;/a>.&lt;/p></description></item><item><title>Evaluación de diferentes modelos de Separación del Hablante</title><link>https://dibernardo.netlify.app/es/p/evaluaci%C3%B3n-de-diferentes-modelos-de-separaci%C3%B3n-del-hablante/</link><pubDate>Fri, 04 Nov 2022 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/es/p/evaluaci%C3%B3n-de-diferentes-modelos-de-separaci%C3%B3n-del-hablante/</guid><description>&lt;p>Este proyecto comenzó como el trabajo final para un seminario de la UNTREF llamado &lt;em>Seminario en Aplicaciones de Redes Neuronales en la recuperación de información musical&lt;/em>. El objetivo era utilizar una Red Neuronal Siamés (SNN, por sus siglas en inglés) en un contexto diferente al visto en clase (detección de similitud musical).&lt;/p>
&lt;p>Para el proyecto final de este curso, desarrollamos un modelo SNN desde cero utilizando el framework &lt;em>Keras&lt;/em> y la arquitectura &lt;em>SincNet&lt;/em> para reducir la dimensionalidad del audio, logrando buenos resultados. Más adelante, para expandir este proyecto, probé otro enfoque utilizando &lt;em>Wav2Vec&lt;/em> para la reducción de dimensionalidad y reimplementé todo el proyecto en el framework &lt;em>PyTorch&lt;/em>. Sin embargo, este intento arrojó resultados subóptimos, lo que indica que la reducción de dimensionalidad con Wav2Vec perdió información crítica necesaria para la tarea de diarización de locutores.&lt;/p>
&lt;h2 id="tarea-de-diarización-de-locutores">Tarea de Diarización de Locutores
&lt;/h2>&lt;p>El objetivo de un modelo de diarización de locutores es identificar diferentes hablantes en un flujo de audio que contiene múltiples voces. Por ejemplo, en un podcast con dos personas (A y B), el modelo debe determinar los pasos de tiempo en los que el hablante A está hablando y los pasos de tiempo en los que el hablante B está hablando (e identificar implícitamente los períodos de silencio). Estos modelos son extremadamente útiles para la edición de audio y el análisis de largas secuencias de audio con múltiples hablantes.&lt;/p>
&lt;h2 id="por-qué-redes-neuronales-siamés">¿Por qué Redes Neuronales Siamés?
&lt;/h2>&lt;p>En clase, exploramos la arquitectura siamés para comparar similitudes entre piezas musicales, desarrollando una herramienta capaz de identificar versiones de canciones famosas.&lt;/p>
&lt;p>Una Red Neuronal Siamés consiste en dos o más subredes idénticas que comparten los mismos pesos y parámetros. Está diseñada para comparar pares de entradas y medir su similitud, generalmente utilizando una métrica de distancia como la distancia euclidiana. Cada subred procesa una entrada, y las salidas se combinan para calcular un puntaje de similitud.&lt;/p>
&lt;p>Con esta comparación de similitudes en mente, quisimos aplicar estas redes a la tarea de diarización de locutores. La idea era generar embeddings de hablantes a partir de audio utilizando un modelo preentrenado y comparar las salidas de diferentes segmentos de audio. Basándonos en el puntaje de similitud, buscamos identificar los segmentos donde diferentes hablantes están hablando.&lt;/p>
&lt;h2 id="experimentos">Experimentos
&lt;/h2>&lt;p>Probé dos métodos diferentes para la extracción de características de audio que servirían como embeddings de hablantes.&lt;/p>
&lt;h3 id="implementación-en-keras-con-sincnet">Implementación en Keras con SincNet
&lt;/h3>&lt;p>En este enfoque, utilizamos la arquitectura SincNet para extraer características específicas de los hablantes a partir del audio. SincNet aplica funciones sinc aprendibles como sus filtros, que son particularmente adecuadas para el procesamiento de audio, ya que imitan los filtros de paso de banda tradicionales. Estas características se introdujeron en la Red Neuronal Siamés, que comparó pares de segmentos de audio para calcular sus puntajes de similitud. El modelo se entrenó con conjuntos de datos de audio etiquetados y observamos un rendimiento sólido al agrupar segmentos de audio por hablante, logrando límites claros entre diferentes hablantes.&lt;/p>
&lt;p>Un informe con los resultados puede encontrarse en el siguiente &lt;a class="link" href="https://github.com/MatiasDiBernardo/Speaker-Diarization-with-SNN/blob/master/TP%20Final%20Seminario%20Redes%20-%20Di%20Bernardo%20Ferreyra.ipynb" target="_blank" rel="noopener"
>notebook de Jupyter&lt;/a> (en español).&lt;/p>
&lt;h3 id="implementación-en-pytorch-con-wav2vec">Implementación en PyTorch con Wav2Vec
&lt;/h3>&lt;p>Para este método, utilicé Wav2Vec, un modelo preentrenado poderoso para la extracción de embeddings profundos de audio. A diferencia de SincNet, los embeddings de Wav2Vec se derivan del aprendizaje autosupervisado, capturando representaciones de alto nivel del audio. Estos embeddings se usaron en la Red Neuronal Siamés para comparaciones de similitud. Sin embargo, los resultados fueron subóptimos para la tarea de diarización. Parece que Wav2Vec, aunque excelente para tareas de reconocimiento de voz, perdió algunos detalles específicos del hablante necesarios para distinguir entre diferentes voces en nuestro contexto.&lt;/p>
&lt;h2 id="resultados">Resultados
&lt;/h2>&lt;p>Los experimentos demostraron que la elección del método de extracción de características es crucial para la diarización de locutores. La implementación en Keras con SincNet superó a la implementación en PyTorch con Wav2Vec, mostrando mayor precisión al identificar transiciones entre hablantes. Esto sugiere que la extracción de características específicas para la tarea, como SincNet, es más efectiva que los embeddings de propósito general como Wav2Vec para la diarización de locutores.&lt;/p>
&lt;p>El código de este proyecto está disponible en este &lt;a class="link" href="https://github.com/MatiasDiBernardo/Speaker-Diarization-with-SNN" target="_blank" rel="noopener"
>repositorio&lt;/a>.&lt;/p>
&lt;h2 id="conclusiones">Conclusiones
&lt;/h2>&lt;p>Este proyecto fue una de mis primeras experiencias con modelos de aprendizaje profundo, donde apliqué mis conocimientos a un problema sin seguir un artículo específico o utilizar un modelo preentrenado. Exploré diferentes soluciones y concluí sobre la importancia de la extracción de características y la selección del modelo.&lt;/p>
&lt;p>También me ayudó a familiarizarme con la sintaxis de los frameworks de aprendizaje profundo más populares y a solidificar mi comprensión en el proceso.&lt;/p></description></item></channel></rss>