{"id":67,"date":"2023-02-08T03:38:16","date_gmt":"2023-02-08T03:38:16","guid":{"rendered":"https:\/\/thedataprocessblog.com\/?p=67"},"modified":"2023-02-08T03:38:16","modified_gmt":"2023-02-08T03:38:16","slug":"por-que-os-transformers-mudaram-tudo-antes","status":"publish","type":"post","link":"https:\/\/thedataprocessblog.com\/?p=67&lang=pt","title":{"rendered":"Por que os transformers mudaram tudo: antes"},"content":{"rendered":"\n<p>Nesta s\u00e9rie de artigos, discutirei por que a inven\u00e7\u00e3o dos <i>transformers<\/i>, publicada pela equipe de IA do Google no artigo intitulado Attention Is All You Need (2017), foi t\u00e3o importante para o aprendizado de m\u00e1quina e os campos de aprendizado profundo.<\/p>\n\n\n\n<p class=\"has-text-align-left\">Antes de tudo, para entender as realiza\u00e7\u00f5es dessas ideias propostas, \u00e9 preciso primeiro entender como as coisas eram feitas antes. Todos n\u00f3s sabemos que o contexto importa, em alguns casos, importa muito. Por exemplo, ao ler este artigo, voc\u00ea mant\u00e9m todo o texto anterior em mente para compreender as pr\u00f3ximas frases, caso contr\u00e1rio, n\u00e3o faria sentido para voc\u00ea.<\/p>\n\n\n\n<p>Claro, n\u00e3o demora muito para se chegar \u00e0 conclus\u00e3o de que pode haver muitas preocupa\u00e7\u00f5es ao lidar com o contexto. Continuando com a leitura como exemplo, quanto tempo dura o seu contexto? Em outras palavras, de quantas frases (ou ideias) pra tr\u00e1s voc\u00ea se lembra quando l\u00ea um texto? Obviamente a resposta \u00e9 que isso varia. Ent\u00e3o, como podemos inserir isso em um modelo?<\/p>\n\n\n\n<p>Usar uma rede neural com palavras em suas respectivas posi\u00e7\u00f5es como entrada n\u00e3o funcionaria, pois o modelo teria que ter um tamanho de entrada fixo e estabelecemos que um contexto n\u00e3o pode ter um comprimento fixo. Uma das primeiras ideias foi usar RNNs ou <strong>Redes Neurais Recorrentes<\/strong> (<strong>Recurrent Neural Networks<\/strong>).<\/p>\n\n\n\n<h3><strong>Redes Neurais Recorrentes<\/strong> (<strong>Recurrent Neural Networks<\/strong>)<\/h3>\n\n\n\n<p>As redes neurais recorrentes s\u00e3o assim:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/01\/Recurrent_neural_network_unfold.svg_.png\" alt=\"\" class=\"wp-image-60\" width=\"609\" height=\"203\" srcset=\"https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/01\/Recurrent_neural_network_unfold.svg_.png 512w, https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/01\/Recurrent_neural_network_unfold.svg_-300x100.png 300w\" sizes=\"(max-width: 609px) 100vw, 609px\" \/><figcaption class=\"wp-element-caption\">Source: wikipedia.com<\/figcaption><\/figure>\n\n\n\n<p>O <em>h<\/em> na imagem \u00e9 simplesmente uma fun\u00e7\u00e3o de ativa\u00e7\u00e3o e pesos. <em>x<\/em> s\u00e3o as entradas em cada estado e <em>o<\/em> \u00e9 a sa\u00edda de previs\u00e3o para esse estado. O importante a notar aqui \u00e9 que os pesos s\u00e3o iguais entre todas as unidades da rede. Isso confere as seguintes vantagens ao modelo:<\/p>\n\n\n\n<ol>\n<li>Informa\u00e7\u00f5es sobre estados passados s\u00e3o usadas pela rede para calcular a sa\u00edda (previs\u00e3o) do modelo;<\/li>\n\n\n\n<li>A quantidade de estados passados pode variar indefinidamente;<\/li>\n\n\n\n<li>O modelo \u00e9 muito eficiente computacionalmente e, portanto, s\u00e3o facilmente treinados.<\/li>\n<\/ol>\n\n\n\n<p>Infelizmente, embora as vantagens desse tipo de modelo pare\u00e7am grandes, existem alguns problemas que dificultam essa abordagem:<\/p>\n\n\n\n<ol>\n<li>As informa\u00e7\u00f5es de v\u00e1rios estados anteriores s\u00e3o quase totalmente perdidas e ficam praticamente indispon\u00edveis na \u00faltima etapa do c\u00e1lculo (a \u00faltima camada);<\/li>\n\n\n\n<li>Este modelo sofre do problema de gradiente <strong>Desaparecendo\/Explodindo (Vanishing\/Exploding)<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Essas limita\u00e7\u00f5es restringem os casos de uso desse m\u00e9todo a situa\u00e7\u00f5es em que o n\u00famero de estados passados a serem considerados \u00e9 relativamente pequeno. No entanto, a arquitetura proposta pode ser alterada para corrigir esses problemas.<\/p>\n\n\n\n<h3>Problema de gradiente <strong>Desaparecendo\/Explodindo (Vanishing\/Exploding)<\/strong><\/h3>\n\n\n\n<p>O problema do gradiente de desaparecendo\/explodindo ocorre porque as entradas dos estados anteriores s\u00e3o multiplicadas pelos pesos e passam pela fun\u00e7\u00e3o de ativa\u00e7\u00e3o muitas vezes antes de atingir a camada final.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"427\" src=\"https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/02\/image-1024x427.png\" alt=\"\" class=\"wp-image-63\" srcset=\"https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/02\/image-1024x427.png 1024w, https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/02\/image-300x125.png 300w, https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/02\/image-768x320.png 768w, https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/02\/image-1536x640.png 1536w, https:\/\/thedataprocessblog.com\/wp-content\/uploads\/2023\/02\/image-2048x853.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Source: https:\/\/dustinstansbury.github.io\/theclevermachine\/derivation-common-neural-network-activation-functions<\/figcaption><\/figure>\n\n\n\n<p>Se dermos uma olhada nas fun\u00e7\u00f5es de ativa\u00e7\u00e3o e suas derivadas na imagem acima veremos que nos limites positivo e negativo as derivadas v\u00e3o a zero, exceto a fun\u00e7\u00e3o linear (que ningu\u00e9m usa, pois n\u00e3o introduz n\u00e3o linearidade ao modelo). Dessa forma, voc\u00ea pode imaginar que uma entrada sendo multiplicada muitas vezes por um \u00fanico valor e passada muitas vezes por uma fun\u00e7\u00e3o de ativa\u00e7\u00e3o teria uma pequena derivada final.<\/p>\n\n\n\n<p>Como a atualiza\u00e7\u00e3o dos pesos depende da derivada parcial da entrada, se for muito pequena, as atualiza\u00e7\u00f5es ficam muito pequenas tamb\u00e9m e isso prejudica o desempenho do modelo. O gradiente explosivo tem mais a ver com a forma como os pesos s\u00e3o inicializados, eles podem crescer muito e as atualiza\u00e7\u00f5es podem se tornar t\u00e3o grandes que o modelo nunca converge.<\/p>\n\n\n\n<p>Algumas solu\u00e7\u00f5es podem ser aplicadas para resolver o problema apresentado:<\/p>\n\n\n\n<ol>\n<li>Use outras fun\u00e7\u00f5es de ativa\u00e7\u00e3o, como ReLU. Esta fun\u00e7\u00e3o de ativa\u00e7\u00e3o tem uma derivada constante, portanto, o gradiente n\u00e3o desaparece (para uma entrada positiva);<\/li>\n\n\n\n<li>Gradient clipping: limite o gradiente para um valor m\u00e1ximo;<\/li>\n\n\n\n<li>Use Batch Normalization: esta t\u00e9cnica aprende um processo de normaliza\u00e7\u00e3o para transformar a sa\u00edda de cada camada.<\/li>\n<\/ol>\n\n\n\n<p>Voc\u00ea tamb\u00e9m pode tentar alterar a arquitetura do modelo para superar esse problema.<\/p>\n\n\n\n<p>Para o pr\u00f3ximo artigo, discutirei a pr\u00f3xima arquitetura de Modelos de Linguagem Natural, que surgiu como uma alternativa para resolver os problemas impostos pelas RNNs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesta s\u00e9rie de artigos, discutirei por que a inven\u00e7\u00e3o dos transformers, publicada pela equipe de IA do Google no artigo intitulado Attention Is All You Need (2017), foi t\u00e3o importante para o aprendizado de m\u00e1quina e os campos de aprendizado profundo. Antes de tudo, para entender as realiza\u00e7\u00f5es dessas ideias propostas, \u00e9 preciso primeiro entender &hellip; <a href=\"https:\/\/thedataprocessblog.com\/?p=67&#038;lang=pt\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Por que os transformers mudaram tudo: antes<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=\/wp\/v2\/posts\/67"}],"collection":[{"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=67"}],"version-history":[{"count":1,"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":69,"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=\/wp\/v2\/posts\/67\/revisions\/69"}],"wp:attachment":[{"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thedataprocessblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}