{"id":133780,"date":"2021-12-14T15:48:40","date_gmt":"2021-12-14T14:48:40","guid":{"rendered":"https:\/\/multi.liora.io\/?p=133780"},"modified":"2026-02-09T15:44:07","modified_gmt":"2026-02-09T14:44:07","slug":"recurrent-neural-network-rnn-de-que-se-trata","status":"publish","type":"post","link":"https:\/\/liora.io\/es\/recurrent-neural-network-rnn-de-que-se-trata","title":{"rendered":"Recurrent Neural Network (RNN): \u00bfde qu\u00e9 se trata?"},"content":{"rendered":"<p><strong><b data-stringify-type=\"bold\">\u00bfHas echado de menos a Daniel? \u00a1Nosotros tambi\u00e9n! Hoy, nuestro experto en Data Science que acompa\u00f1a a los alumnos a lo largo de su formaci\u00f3n responde a esta pregunta: \u00bfC\u00f3mo funcionan las redes neuronales recurrentes?<\/b><\/strong><\/p>\nSi eres un adepto a nuestro blog, ya sabr\u00e1s qu\u00e9 es una red neuronal (<b>si no es as\u00ed, no dudes en leer este art\u00edculo antes<\/b>), pero \u00bfqu\u00e9 aporta el adjetivo recurrente a este modelo? En este art\u00edculo vamos a ver c\u00f3mo se han convertido las redes neuronales recurrentes, llamadas RNN, en un modelo cl\u00e1sico dentro del Deep Learning.\n<h3>Puesta en situaci\u00f3n<\/h3>\nAntes de explicitar una RNN, centr\u00e9monos en una pelota. Efectivamente, en Machine Learning suele ser frecuente querer predecir la trayectoria de un objeto m\u00f3vil. Como nos muestra la figura 1, desde el punto de partida, la pelota puede ir en cualquier direcci\u00f3n. \u00bfC\u00f3mo podemos saber cu\u00e1l es el pr\u00f3ximo movimiento de la pelota?\n<img decoding=\"async\" width=\"800\" height=\"656\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere_Plan-de-travail-1-1024x840.png\" alt=\"\" loading=\"lazy\">\n\nSin embargo, si tomamos la figura 2, es evidente decir que la pelota va a seguir yendo hacia la derecha, gracias a las trayectorias anteriores, que traducen un movimiento hacia la derecha.\n\nHasta aqu\u00ed todo parece l\u00f3gico.\n<blockquote><i>Al contrario que en la figura 1, tenemos m\u00e1s datos de entrenamiento adicionales, de ah\u00ed que seamos capaces de decidir el desplazamiento de la pelota.<\/i><\/blockquote>\nDe este modo, basta con darle a nuestra red neuronal los antiguos desplazamientos de la pelota y se acab\u00f3 el estudio. Sin embargo, \u00bfc\u00f3mo podemos elegir el n\u00famero de neuronas de entrada? Una trayectoria puede ser compartida de la manera que queramos. Ya sea 10 o 100.\n\n<img decoding=\"async\" width=\"800\" height=\"243\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere_Plan-de-travail-1-copie-1024x311.png\" alt=\"\" loading=\"lazy\">\n\nLa pelota azul oscuro representa la posici\u00f3n actual de la pelota y las pelotas azul claro representan las antiguas trayectorias de nuestra pelota. De este modo adivinamos que la pelota se dirige hacia la derecha.\n\nOcultemos ese detalle por ahora, y fijemos el tama\u00f1o de nuestras muestras de entrada. Observemos la figura 3, \u00bfhacia d\u00f3nde se va a dirigir la pelota?&nbsp;\n\n<img decoding=\"async\" width=\"800\" height=\"484\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere_Plan-de-travail-1-copie-2-1024x619.png\" alt=\"\" loading=\"lazy\">\n\nEs cierto que el movimiento de la pelota es m\u00e1s complejo que en la figura 1, pero seguimos pudiendo decir que el siguiente desplazamiento de la pelota ser\u00e1 hacia arriba. \u00bfHar\u00e1 el modelo la misma predicci\u00f3n? Por desgracia no, ya que la red neuronal no piensa como nosotros. El modelo, al contrario que nosotros, no toma en cuenta <b>el v\u00ednculo entre las entradas<\/b>. Las entradas no son independientes las unas de las otras, por lo que debemos conservar ese v\u00ednculo entre ellas cuando entrenamos a nuestra red neuronal.\n\nTenemos que paliar 2 problemas :\n<ul>\n \t<li style=\"font-weight: 400\">El tama\u00f1o de nuestras muestras de entrada <b>que no es fijo<\/b>.<\/li>\n \t<li style=\"font-weight: 400\">Los datos de entrada <b>no est\u00e1n vinculados entre ellos<\/b>.<\/li>\n<\/ul>\n<b>Transici\u00f3n hacia la RNN<\/b>\n\nVolvamos a nuestro estudio de trayectoria de pelota. Vamos a considerar un plan, de ese modo la trayectoria de la pelota tendr\u00e1 dos coordenadas, que llamaremos x^1,x^2 y queremos predecir la pr\u00f3xima ubicaci\u00f3n de la pelota, la predicci\u00f3n de las futuras coordenadas ser\u00e1 \u0177^1,\u0177^2. Vamos a representarlo con una red neuronal tradicional.\n\n<img decoding=\"async\" width=\"800\" height=\"365\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere-04.png\" alt=\"\" loading=\"lazy\">\n\nDe manera sint\u00e9tica, si planteamos (x^1,x^2)=x_t y (\u0177^1,\u0177^2)=\u0177_t, podemos hacer el siguiente esquema de abajo:\n\n<img decoding=\"async\" width=\"800\" height=\"389\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere-05-1.png\" alt=\"\" loading=\"lazy\">\n\nAqu\u00ed el \u00edndice <i>t<\/i> indica las coordenadas de la pelota en el momento <i>t<\/i>, representando la red neuronal con una funci\u00f3n <i>f<\/i>, nos queda :\n\nf(x_t)=\u0177_t (retomar el estilo matem\u00e1tico de la f\u00f3rmula RNN (abajo en ingl\u00e9s))\n\nComo hemos indicado antes, estudiamos el movimiento de la pelota de manera local. Queremos tener en cuenta varios instantes del movimiento de la pelota. Si no lo conseguimos con una red neuronal tradicional, con las RNN, todo cambia, porque se introduce el concepto de <b>recurrencia<\/b>. Efectivamente, observemos la figura de abajo. A\u00f1adimos <b>una entrada<\/b> <i>h_t<\/i>, llamada <b>estado escondido<\/b> (hidden state). Ese estado escondido encarna <i>\u0177_t<\/i> y se da como argumento para la pr\u00f3xima predicci\u00f3n adem\u00e1s de la entrada <i>x_t<\/i>. Efectivamente hemos considerado un conjunto y por tanto, vinculamos las salidas y las entradas sin l\u00edmite para nuestras muestras de entrada.\n\n<img decoding=\"async\" width=\"800\" height=\"620\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere-06-1024x793.png\" alt=\"\" loading=\"lazy\">\n\nSi tratamos de simbolizarlo con una f\u00f3rmula, obtenemos la siguiente ecuaci\u00f3n :&nbsp;\n\n<img decoding=\"async\" width=\"800\" height=\"760\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere-08.png\" alt=\"\" loading=\"lazy\">\n\nAqu\u00ed se percibe bien el concepto de recurrencia. Para predecir el pr\u00f3ximo t\u00e9rmino, necesitamos informaci\u00f3n previa proporcionada por <i>h_{t-1}<\/i>.&nbsp;\n\nLa recurrencia es a\u00fan m\u00e1s flagrante en este esquema recapitulativo.\n<h3>\nQuelques applications des RNN<\/h3>\n<img decoding=\"async\" width=\"800\" height=\"335\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2021\/07\/Sans-titre-1-Recupere-07-1024x429.png\" alt=\"\" loading=\"lazy\">\n<ul>\n \t<li style=\"font-weight: 400\"><i>one to many<\/i>: la RNN recibe <b>una \u00fanica entrada<\/b> y devuelve <b>varias salidas<\/b>,<\/li>\n<\/ul>\nel ejemplo cl\u00e1sico de este procedimiento es la leyenda de la imagen.\n<ul>\n \t<li style=\"font-weight: 400\"><i>many to <\/i>one: tenemos varias entradas y solo hay una salida. Una ilustraci\u00f3n de este modo es el <b>an\u00e1lisis de sentimiento en textos<\/b>. Esto permite identificar un sentimiento a partir de un grupo de palabras, determinar la palabra que falta para terminar la frase recibida en entrada. Para aprender m\u00e1s sobre el an\u00e1lisis de sentimientos, consulta este art\u00edculo.<\/li>\n \t<li style=\"font-weight: 400\"><i>many to many<\/i>: por ultimo, podemos tomar varias entradas y obtener varias salidas. No tenemos por qu\u00e9 tener el mismo n\u00famero de neuronas de entrada y de salida. Aqu\u00ed podemos citar, la traducci\u00f3n de textos, pero tambi\u00e9n ser ambiciosos y prever el fin de una obra musical a partir de su comienzo.<\/li>\n<\/ul>\nPerfecto, hemos visto el funcionamiento de una RNN y sus m\u00faltiples aplicaciones, pero \u00bfes perfecto? Por desgracia, presenta un gran inconveniente, llamado <b>memoria a corto plazo<\/b>, de la que veremos un ejemplo en TALN (Tratamiento autom\u00e1tico del lenguaje natural).\n<ul>\n \t<li><b>\u00bfTiene la RNN memoria de pez?<\/b>\n\nRetomemos el caso de completa una frase.&nbsp;\n\n<i>Me gusta el sushi, me voy a comer a<\/i>\u2026<\/li>\n<\/ul>\nLa RNN no es capaz de retener la palabra sushi para predecir Jap\u00f3n, ya que no ha retenido la palabra sushi. Para llegar a determinar Jap\u00f3n, es necesario que la RNN posea una memoria mejor. Para ello hay que conseguir que las neuronas sean m\u00e1s complejas. En particular, vamos a ver el caso de la <b>LSTM<\/b> (<i>Long Short Term Memory<\/i>). Adem\u00e1s del estado escondido convencional <i>h_t<\/i>, vamos a a\u00f1adir un segundo estado <i>c_t<\/i>. Aqu\u00ed, <i>h_t<\/i> representa la <b>memoria corta<\/b> neuronal y <i>c_t<\/i> la <b>memoria larga<\/b>.\n\nNo vamos a entrar en las consideraciones t\u00e9cnicas de este esquema aterrador. Lo esencial es observar que tenemos una c\u00e9lula mucho m\u00e1s compleja, que nos permite solucionar el problema de memoria. Con la LSTM, vamos a pasar las h_t y c_t por <b>puertas<\/b>, 4 en total.\n<ul>\n \t<li style=\"font-weight: 400\">La primera puerta permite eliminar la informaci\u00f3n in\u00fatil, es la <b>forget gate<\/b>.<\/li>\n \t<li style=\"font-weight: 400\">La segunda puerta, almacena la informaci\u00f3n nueva, la <b>store gate<\/b>.<\/li>\n \t<li style=\"font-weight: 400\">La tercera puerta actualiza la informaci\u00f3n que vamos a dar a la RNN con el resultado de la forget gate y la store gate, es la <b>update gate<\/b>.<\/li>\n \t<li style=\"font-weight: 400\">Y la \u00faltima puerta (<b>output gate<\/b>), nos da <i>y_t <\/i>y <i>h_t<\/i>.<\/li>\n<\/ul>\nEste largo proceso permite controlar la informaci\u00f3n que conservamos y transmitimos a trav\u00e9s del tiempo.\n\nLa RNN llega a saber qu\u00e9 hay que guardar y qu\u00e9 hay que olvidar, gracias a su aprendizaje. La <b>LSTM<\/b> (<i>Long Short Term Memory<\/i>) no es \u00fanica, tambi\u00e9n podemos usar <b>GRU<\/b> (<i>Gated Recurrent Unit<\/i>), solo cambia la arquitectura de la c\u00e9lula.\n\nAhora resumamos lo que hemos visto. Las RNN son un tipo particular de redes neuronales que permiten tratar datos que no son <b>independientes<\/b> y que no tienen un <b>tama\u00f1o fijo<\/b>. No obstante. las RNN est\u00e1ndar est\u00e1n bastante limitadas con el problema de <b>memoria corta<\/b>, pero lo podemos resolver utilizando c\u00e9lulas m\u00e1s complejas como las <b>LSTM<\/b> o <b>GRU<\/b>.&nbsp;\n\nAdem\u00e1s, podemos hacer un paralelismo con otro sistema de red neuronal: las <b>redes neuronales convolucionales<\/b> (CNN en ingl\u00e9s). Efectivamente las CNN son conocidas por compartir <b>la informaci\u00f3n espacial<\/b> mientras que las RNN comparten la <b>informaci\u00f3n temporal<\/b>. Encontrar\u00e1s m\u00e1s informaci\u00f3n sobre las CNN en <a href=\"https:\/\/liora.io\/convolutional-neural-network\">este art\u00edculo<\/a>. Y por \u00faltimo, si quieres poner en pr\u00e1ctica las RNN, no dudes en apuntarte a nuestro curso de Data Scientist.\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center\"><div class=\"wp-block-button \"><a class=\"wp-block-button__link wp-element-button \" href=\"\/formation\/data-ia\/\">Descubrir el curso<\/a><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfHas echado de menos a Daniel? \u00a1Nosotros tambi\u00e9n! Hoy, nuestro experto en Data Science que acompa\u00f1a a los alumnos a lo largo de su formaci\u00f3n responde a esta pregunta: \u00bfC\u00f3mo funcionan las redes neuronales recurrentes? Si eres un adepto a nuestro blog, ya sabr\u00e1s qu\u00e9 es una red neuronal (si no es as\u00ed, no dudes [&hellip;]<\/p>\n","protected":false},"author":74,"featured_media":80135,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"editor_notices":[],"footnotes":""},"categories":[2440],"class_list":["post-133780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-ia"],"acf":[],"_links":{"self":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts\/133780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/users\/74"}],"replies":[{"embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/comments?post=133780"}],"version-history":[{"count":1,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts\/133780\/revisions"}],"predecessor-version":[{"id":183565,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts\/133780\/revisions\/183565"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/media\/80135"}],"wp:attachment":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/media?parent=133780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/categories?post=133780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}