{"id":53143,"date":"2019-11-24T00:00:00","date_gmt":"2019-11-23T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru"},"modified":"2020-02-18T14:01:00","modified_gmt":"2020-02-18T11:01:00","slug":"ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","title":{"rendered":"Implementa\u00e7\u00e3o de machine learning no Mail.ru","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/ee5728dccb94b849ad3bfd9cf84ad74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Inspirado nas minhas apresenta\u00e7\u00f5es no Highload++ e DataFest Minsk 2019.<\/i><\/p>\n<p>Para muitos, hoje, o e-mail \u00e9 uma parte indispens\u00e1vel da vida online. Atrav\u00e9s dele, conduzimos comunica\u00e7\u00f5es comerciais, armazenamos diversas informa\u00e7\u00f5es importantes relacionadas a finan\u00e7as, reservas de hot\u00e9is, processamento de pedidos e muito mais. Em meados de 2018, formulamos uma estrat\u00e9gia de produto para o desenvolvimento do e-mail. Como deve ser o e-mail moderno?<\/p>\n<p>O e-mail deve ser <b>inteligente<\/b>, ou seja, ajudar os usu\u00e1rios a navegar na crescente quantidade de informa\u00e7\u00f5es: filtrar, estruturar e apresent\u00e1-las da maneira mais conveniente. Ele deve ser <b>\u00fatil<\/b>, permitindo resolver diversas tarefas diretamente na caixa de entrada, como, por exemplo, pagar multas (uma funcionalidade da qual, para meu lamento, fa\u00e7o uso). E, claro, o e-mail deve garantir seguran\u00e7a da informa\u00e7\u00e3o, bloqueando spam e protegendo contra invas\u00f5es, ou seja, ser <b>segura<\/b>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEssas dire\u00e7\u00f5es definem uma s\u00e9rie de tarefas-chave, muitas das quais podem ser resolvidas de maneira eficaz com o uso de aprendizado de m\u00e1quina. Aqui est\u00e3o exemplos de recursos j\u00e1 em funcionamento, desenvolvidos dentro da estrat\u00e9gia - um para cada dire\u00e7\u00e3o.<\/p>\n<ul>\n<li><b>Resposta Inteligente<\/b>. O e-mail conta com uma fun\u00e7\u00e3o de resposta inteligente. A rede neural analisa o texto do e-mail, compreende seu significado e objetivo e, como resultado, oferece tr\u00eas op\u00e7\u00f5es de resposta mais adequadas: positiva, negativa e neutra. Isso ajuda a economizar significativamente tempo ao responder e-mails, al\u00e9m de muitas vezes possibilitar respostas de forma n\u00e3o convencional e divertida.\n<\/li>\n<li><b>Agrupamento de e-mails<\/b>, relacionados a pedidos em lojas online. Frequentemente compramos pela internet e, em geral, as lojas podem enviar v\u00e1rios e-mails para cada pedido. Por exemplo, da AliExpress, o maior servi\u00e7o, chega uma quantidade significativa de e-mails para um \u00fanico pedido, e calculamos que, em casos extremos, essa quantidade pode chegar a 29. Portanto, com o uso do modelo de Reconhecimento de Entidades Nomeadas, extra\u00edmos o n\u00famero do pedido e outras informa\u00e7\u00f5es do texto e agrupamos todos os e-mails em uma \u00fanica thread. Tamb\u00e9m mostramos as informa\u00e7\u00f5es principais sobre o pedido em uma barra separada, facilitando o trabalho com esse tipo de e-mail.\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/8b37b0bf0c0d152498027bc25d476128.jpg\" style=\"display:block;margin: 0 auto;\" \/>\n<\/li>\n<li><b>Antiphishing<\/b>Phishing \u00e9 um tipo de e-mail criminoso altamente perigoso, pelo qual os golpistas tentam obter informa\u00e7\u00f5es financeiras (incluindo dados de cart\u00f5es de cr\u00e9dito dos usu\u00e1rios) e logins. Esses e-mails imitam os verdadeiros, enviados pelos servi\u00e7os, inclusive visualmente. Portanto, com o uso de Computer Vision, conseguimos reconhecer os logotipos e o estilo de formata\u00e7\u00e3o dos e-mails de grandes empresas (como Mail.ru, Sber, Alfa) e consideramos isso junto com o texto e outros sinais em nossos classificadores de spam e phishing.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Aprendizado de M\u00e1quina<\/h2>\n<p>\nUm pouco sobre aprendizado de m\u00e1quina em e-mails, em geral. O e-mail \u00e9 um sistema de alta carga: nossos servidores processam, em m\u00e9dia, 1,5 bilh\u00f5es de e-mails por dia para 30 milh\u00f5es de usu\u00e1rios ativos. Cerca de 30 sistemas de aprendizado de m\u00e1quina cuidam de todas as fun\u00e7\u00f5es e recursos necess\u00e1rios. <\/p>\n<p>Cada e-mail passa por uma verdadeira linha de classifica\u00e7\u00e3o. Primeiro, filtramos o spam e deixamos os bons e-mails. Os usu\u00e1rios muitas vezes n\u00e3o percebem o trabalho do anti-spam, porque 95-99% do spam nem chega \u00e0 pasta apropriada. A identifica\u00e7\u00e3o de spam \u00e9 uma parte muito importante do nosso sistema e a mais complexa, pois na \u00e1rea de anti-spam h\u00e1 uma constante adapta\u00e7\u00e3o entre os sistemas de defesa e ataque, o que apresenta um desafio cont\u00ednuo para nossa equipe.<\/p>\n<p>Em seguida, separamos os e-mails de pessoas e rob\u00f4s. Os e-mails de pessoas s\u00e3o os mais importantes, por isso, para eles, oferecemos fun\u00e7\u00f5es como Smart Reply. Os e-mails de rob\u00f4s s\u00e3o divididos em duas partes: transacionais \u2014 s\u00e3o e-mails importantes de servi\u00e7os, como confirma\u00e7\u00f5es de compras ou reservas de hotel, e financeiros \u2014 s\u00e3o an\u00fancios de neg\u00f3cios e descontos. <\/p>\n<p>Acreditamos que os e-mails transacionais t\u00eam a mesma import\u00e2ncia da correspond\u00eancia pessoal. Eles devem estar \u00e0 m\u00e3o, pois muitas vezes \u00e9 necess\u00e1rio encontrar rapidamente informa\u00e7\u00f5es sobre um pedido ou a reserva de um voo, e gastamos tempo procurando esses e-mails. Portanto, para conveni\u00eancia, os separamos automaticamente em seis categorias principais: viagens, pedidos, finan\u00e7as, ingressos, registros e, finalmente, multas.<\/p>\n<p>Os comunicados informativos s\u00e3o o grupo mais numeroso e, provavelmente, o menos importante, pois n\u00e3o exigem uma rea\u00e7\u00e3o imediata; nada substancial mudar\u00e1 na vida do usu\u00e1rio se ele n\u00e3o ler tal comunicado. Na nossa nova interface, agrupamos esses comunicados em dois threads: redes sociais e newsletters, assim, limpando visualmente a caixa de entrada e deixando \u00e0 vista apenas os e-mails importantes.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/175773879daaa29d1542a98070cb7972.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opera\u00e7\u00e3o<\/h3>\n<p>\nUm grande n\u00famero de sistemas traz muitas dificuldades em sua opera\u00e7\u00e3o. Afinal, os modelos, com o tempo, se degradam, assim como qualquer software: as fun\u00e7\u00f5es falham, as m\u00e1quinas param de funcionar, e c\u00f3digos problem\u00e1ticos surgem. Al\u00e9m disso, os dados mudam constantemente: novos dados s\u00e3o adicionados, o padr\u00e3o de comportamento dos usu\u00e1rios se transforma, etc., por isso um modelo sem o devido suporte tende a funcionar cada vez pior com o tempo. <\/p>\n<p>N\u00e3o podemos esquecer que quanto mais o aprendizado de m\u00e1quina se infiltra na vida dos usu\u00e1rios, maior \u00e9 a influ\u00eancia que eles exercem sobre o ecossistema, e, como consequ\u00eancia, maiores podem ser as perdas financeiras ou os lucros que os players do mercado obt\u00eam. Assim, em um n\u00famero cada vez maior de \u00e1reas, os players se adaptam para trabalhar com algoritmos de ML (exemplos cl\u00e1ssicos incluem publicidade, busca e o j\u00e1 mencionado anti-spam).<\/p>\n<p>Al\u00e9m disso, as tarefas de aprendizado de m\u00e1quina t\u00eam uma particularidade: qualquer altera\u00e7\u00e3o, mesmo que insignificante, no sistema pode gerar muito trabalho com o modelo: manipula\u00e7\u00e3o de dados, re-treinamento, deploy, o que pode se estender por semanas ou meses. Portanto, quanto mais rapidamente o ambiente em que seus modelos operam muda, mais esfor\u00e7o \u00e9 necess\u00e1rio para mant\u00ea-los. A equipe pode criar muitos sistemas e se alegrar com isso, mas depois gastar quase todos os recursos na manuten\u00e7\u00e3o deles, sem ter a possibilidade de criar algo novo. J\u00e1 enfrentei uma situa\u00e7\u00e3o assim na equipe de anti-spam e cheguei \u00e0 conclus\u00e3o \u00f3bvia de que a manuten\u00e7\u00e3o precisa ser automatizada.<\/p>\n<h3>Automa\u00e7\u00e3o<\/h3>\n<p>\nO que pode ser automatizado? Na verdade, quase tudo. Eu destaquei quatro dire\u00e7\u00f5es que definem a infraestrutura do aprendizado de m\u00e1quina:<\/p>\n<ul>\n<li>coleta de dados;\n<\/li>\n<li>re-treinamento;\n<\/li>\n<li>deploy;\n<\/li>\n<li>testes &amp; monitoramento.\n<\/li>\n<\/ul>\n<p>\nSe o ambiente \u00e9 inst\u00e1vel e muda constantemente, toda a infraestrutura ao redor do modelo acaba sendo muito mais importante do que o pr\u00f3prio modelo. Pode ser um bom e velho classificador linear, mas se as caracter\u00edsticas forem bem fornecidas e um bom feedback dos usu\u00e1rios for estabelecido, ele funcionar\u00e1 muito melhor do que modelos State-Of-The-Art com todos os recursos adicionais.<\/p>\n<h4>Ciclo de feedback<\/h4>\n<p>\nEsse ciclo integra a coleta de dados, o re-treinamento e o deployment \u2014 resumindo, todo o ciclo de atualiza\u00e7\u00e3o do modelo. Por que isso \u00e9 importante? Veja o gr\u00e1fico de registro de contas de e-mail:<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/f3c98bd49a101754cf299821a40e2b8e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO desenvolvedor de aprendizado de m\u00e1quina implementou um modelo anti-bots, que impede que bots se registrem em contas de e-mail. O gr\u00e1fico cai para um valor onde permanecem apenas usu\u00e1rios reais. Tudo \u00f3timo! Mas, ap\u00f3s quatro horas, os criadores de bots ajustam seus scripts, e tudo volta ao normal. Neste caso, o desenvolvedor gastou um m\u00eas adicionando caracter\u00edsticas e re-treinando o modelo, mas o spammer conseguiu se adaptar em quatro horas.<\/p>\n<p>Para que n\u00e3o seja t\u00e3o doloroso e n\u00e3o tenhamos que refazer tudo depois, \u00e9 preciso pensar desde o in\u00edcio em como ser\u00e1 o ciclo de feedback e o que faremos se o ambiente mudar. Vamos come\u00e7ar pela coleta de dados \u2014 esse \u00e9 o combust\u00edvel para nossos algoritmos.<\/p>\n<h2>Coleta de dados<\/h2>\n<p>\n\u00c9 claro que, para redes neurais modernas, quanto mais dados, melhor, e esses dados, essencialmente, s\u00e3o gerados pelos usu\u00e1rios do produto. Podemos contar com os usu\u00e1rios para rotular os dados, mas n\u00e3o devemos abusar disso, porque, em algum momento, os usu\u00e1rios se cansar\u00e3o de treinar seus modelos e mudar\u00e3o para outro produto. <\/p>\n<p>Um dos erros mais comuns (aqui fa\u00e7o refer\u00eancia a Andrew Ng) \u00e9 uma orienta\u00e7\u00e3o excessivamente forte em m\u00e9tricas no conjunto de dados de teste, e n\u00e3o no feedback do usu\u00e1rio, que \u00e9 na verdade o principal crit\u00e9rio de qualidade, pois estamos criando um produto para o usu\u00e1rio. Se o usu\u00e1rio n\u00e3o entende ou n\u00e3o gosta do funcionamento do modelo, tudo ser\u00e1 em v\u00e3o. <\/p>\n<p>Portanto, o usu\u00e1rio sempre deve ter a oportunidade de votar, devemos fornecer a ele uma ferramenta para feedback. Se acreditamos que um e-mail recebeu a classifica\u00e7\u00e3o de financeiro, devemos marc\u00e1-lo como \"finan\u00e7as\" e desenhar um bot\u00e3o que o usu\u00e1rio possa clicar para dizer que isso n\u00e3o se trata de finan\u00e7as.<\/p>\n<h3>Qualidade do feedback<\/h3>\n<p>\nVamos discutir a qualidade do feedback do usu\u00e1rio. Primeiro, voc\u00ea e o usu\u00e1rio podem atribuir diferentes significados a um mesmo conceito. Por exemplo, voc\u00ea e os gerentes de produto podem achar que \"finan\u00e7as\" se refere a cartas do banco, enquanto o usu\u00e1rio acredita que a carta da av\u00f3 sobre a aposentadoria tamb\u00e9m se enquadra em finan\u00e7as. Em segundo lugar, h\u00e1 usu\u00e1rios que pressionam bot\u00f5es sem qualquer l\u00f3gica. Em terceiro lugar, o usu\u00e1rio pode estar profundamente equivocado em suas conclus\u00f5es. Um exemplo claro da nossa pr\u00e1tica \u00e9 a implementa\u00e7\u00e3o de um classificador <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%B8%D0%B3%D0%B5%D1%80%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D0%B8%D1%81%D1%8C%D0%BC%D0%B0\">de spam nigeriano<\/a><\/noindex>, um tipo bastante curioso de spam, onde se oferece ao usu\u00e1rio a chance de recuperar milh\u00f5es de d\u00f3lares de um parente distante repentinamente encontrado na \u00c1frica. Ap\u00f3s a implementa\u00e7\u00e3o desse classificador, verificamos os cliques em \"N\u00e3o \u00e9 spam\" nessas cartas, e descobrimos que 80% delas eram puro spam nigeriano, o que indica que os usu\u00e1rios podem ser extremamente credul\u00e1rios.<\/p>\n<p>E n\u00e3o podemos esquecer que n\u00e3o s\u00e3o apenas pessoas que clicam nos bot\u00f5es, mas tamb\u00e9m diversos bots que se passam por navegadores. Portanto, o feedback bruto n\u00e3o \u00e9 adequado para o treinamento. O que pode ser feito com essa informa\u00e7\u00e3o?<\/p>\n<p>Aplicamos duas abordagens: <\/p>\n<ul>\n<li><b>Feedback de ML relacionado<\/b>. Por exemplo, temos um sistema online anti-bot que, como j\u00e1 mencionei, toma decis\u00f5es r\u00e1pidas com base em um n\u00famero limitado de caracter\u00edsticas. E h\u00e1 um segundo sistema, mais lento, que opera post factum. Ele possui mais dados sobre o usu\u00e1rio, seu comportamento, etc. Como consequ\u00eancia, \u00e9 tomada a decis\u00e3o mais ponderada, o que resulta em uma maior precis\u00e3o e completude. Podemos direcionar a diferen\u00e7a de funcionamento desses sistemas para o primeiro como dados para treinamento. Dessa forma, o sistema mais simples estar\u00e1 sempre tentando se aproximar do desempenho do sistema mais complexo.\n<\/li>\n<li><b>Classifica\u00e7\u00e3o de cliques<\/b>\u00c9 poss\u00edvel classificar cada clique do usu\u00e1rio, avaliar sua validade e possibilidade de uso. Fazemos isso no anti-spam de e-mail, utilizando caracter\u00edsticas do usu\u00e1rio, seu hist\u00f3rico, caracter\u00edsticas do remetente, o pr\u00f3prio texto e o resultado do trabalho dos classificadores. No final, obtemos um sistema autom\u00e1tico que valida o feedback do usu\u00e1rio. E como ele precisa ser treinado com muito menos frequ\u00eancia, seu funcionamento pode se tornar a base para todos os outros sistemas. O principal prioridade nesse modelo \u00e9 a precis\u00e3o, pois treinar o modelo com dados imprecisos pode trazer consequ\u00eancias graves. \n<\/li>\n<\/ul>\n<p>\nEnquanto limpamos os dados e treinamos nossos sistemas de ML, n\u00e3o podemos esquecer dos usu\u00e1rios, pois para n\u00f3s, milhares ou milh\u00f5es de erros em um gr\u00e1fico s\u00e3o estat\u00edsticas, mas para o usu\u00e1rio, cada bug \u00e9 uma trag\u00e9dia. Al\u00e9m do fato de que o usu\u00e1rio precisa lidar de alguma forma com o erro em seu produto, ele espera que, ap\u00f3s o feedback, situa\u00e7\u00f5es semelhantes sejam evitadas no futuro. Portanto, sempre devemos oferecer aos usu\u00e1rios n\u00e3o apenas a oportunidade de votar, mas tamb\u00e9m de corrigir o comportamento dos sistemas de ML, criando, por exemplo, heur\u00edsticas pessoais para cada clique de feedback; no caso do e-mail, isso pode ser a possibilidade de filtrar e-mails semelhantes por remetente e assunto para esse usu\u00e1rio.<\/p>\n<p>Al\u00e9m disso, \u00e9 necess\u00e1rio, com base em relat\u00f3rios ou solicita\u00e7\u00f5es de suporte, ajustar a modelo em um modo semi-autom\u00e1tico ou manual, para que outros usu\u00e1rios tamb\u00e9m n\u00e3o sofram com problemas semelhantes.<\/p>\n<h3>Heur\u00edsticas para treinamento<\/h3>\n<p>\nCom esses dados de heur\u00edsticas e ajustes, existem dois problemas. O primeiro \u00e9 que o n\u00famero crescente de ajustes \u00e9 dif\u00edcil de manter, sem mencionar sua qualidade e efic\u00e1cia a longo prazo. O segundo problema \u00e9 que o erro pode n\u00e3o ser frequente, e alguns cliques podem n\u00e3o ser suficientes para treinar o modelo. A princ\u00edpio, parece que esses dois efeitos n\u00e3o relacionados podem ser substancialmente neutralizados se adotarmos a abordagem seguinte.<\/p>\n<ol>\n<li>Criar um ajuste tempor\u00e1rio. \n<\/li>\n<li>Direcionar os dados dele para o modelo, que ser\u00e1 treinado regularmente, incluindo os dados obtidos. Aqui, \u00e9 claro que \u00e9 importante que a heur\u00edstica tenha alta precis\u00e3o, para n\u00e3o comprometer a qualidade dos dados no conjunto de treinamento. \n<\/li>\n<li>Em seguida, configuramos a monitora\u00e7\u00e3o para acionar o atalho, e se, ap\u00f3s algum tempo, o atalho n\u00e3o acionar mais e for completamente coberto pelo modelo, podemos remov\u00ea-lo sem hesita\u00e7\u00e3o. Agora, \u00e9 improv\u00e1vel que esse problema se repita.\n<\/li>\n<\/ol>\n<p>\nPortanto, um ex\u00e9rcito de atalhos \u00e9 muito \u00fatil. O principal \u00e9 que seu uso seja tempor\u00e1rio, e n\u00e3o permanente. <\/p>\n<h2>Aprimoramento<\/h2>\n<p>\nAprimoramento \u00e9 o processo de adicionar novos dados, obtidos a partir do feedback de usu\u00e1rios ou de outros sistemas, e treinar o modelo existente com esses dados. No aprimoramento, pode haver v\u00e1rios problemas:<\/p>\n<ol>\n<li>O modelo pode simplesmente n\u00e3o suportar aprimoramento e s\u00f3 treinar do zero. \n<\/li>\n<li>N\u00e3o est\u00e1 escrito em lugar nenhum que o aprimoramento necessariamente melhorar\u00e1 a qualidade no ambiente de produ\u00e7\u00e3o. Muitas vezes, acontece exatamente o oposto, ou seja, pode at\u00e9 resultar em uma degrada\u00e7\u00e3o.\n<\/li>\n<li>As mudan\u00e7as podem ser imprevis\u00edveis. Esse \u00e9 um ponto delicado que identificamos. Mesmo que um novo modelo, em um teste A\/B, apresente resultados semelhantes ao atual, isso n\u00e3o significa que funcionar\u00e1 da mesma forma. Seu desempenho pode divergir em um \u00fanico percentual, o que pode introduzir novos erros ou reverter erros antigos que j\u00e1 foram corrigidos. Tanto n\u00f3s quanto os usu\u00e1rios j\u00e1 aprendemos a lidar com os erros atuais, e quando um grande n\u00famero de novos erros surge, o usu\u00e1rio tamb\u00e9m pode n\u00e3o entender o que est\u00e1 acontecendo, pois espera um comportamento previs\u00edvel.\n<\/li>\n<\/ol>\n<p>\nPortanto, o mais importante no aprimoramento \u00e9 garantir que o modelo melhore ou, pelo menos, n\u00e3o piore. <\/p>\n<p>A primeira coisa que vem \u00e0 mente quando falamos sobre aprimoramento \u00e9 a abordagem de Aprendizado Ativo. O que isso significa? Por exemplo, um classificador determina se uma mensagem se refere a finan\u00e7as, e ao redor do seu limite de decis\u00e3o, adicionamos uma amostra de exemplos rotulados. Isso funciona bem, por exemplo, em publicidade, onde h\u00e1 muito feedback e \u00e9 poss\u00edvel treinar o modelo em tempo real. E se o feedback for escasso, obtemos uma amostra altamente enviesada em rela\u00e7\u00e3o \u00e0 distribui\u00e7\u00e3o de dados de produ\u00e7\u00e3o, com base na qual n\u00e3o \u00e9 poss\u00edvel avaliar o comportamento do modelo durante a opera\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/fd1b3e07bfaf896dde3248e43537f61a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa verdade, nosso objetivo \u00e9 preservar os padr\u00f5es antigos, modelos j\u00e1 conhecidos, e adquirir novos. Aqui, a continuidade \u00e9 importante. O modelo que frequentemente implementamos com grande dificuldade j\u00e1 est\u00e1 em funcionamento, portanto, podemos nos basear em seu desempenho. <\/p>\n<p>No e-mail, diferentes modelos s\u00e3o aplicados: \u00e1rvores, lineares, redes neurais. Para cada um, elaboramos nosso pr\u00f3prio algoritmo de ajuste. No processo de ajuste, n\u00e3o apenas obtemos novos dados, mas frequentemente tamb\u00e9m novos atributos, que levaremos em considera\u00e7\u00e3o em todos os algoritmos a seguir.<\/p>\n<h3>Modelos lineares<\/h3>\n<p>\nSuponha que temos uma regress\u00e3o log\u00edstica. Montamos a fun\u00e7\u00e3o perda do modelo a partir dos seguintes componentes:<\/p>\n<ul>\n<li>LogLoss em novos dados;\n<\/li>\n<li>regularizamos os pesos dos novos atributos (n\u00e3o tocamos nos antigos);\n<\/li>\n<li>aprendemos tamb\u00e9m com os dados antigos, para preservar os padr\u00f5es estabelecidos;\n<\/li>\n<li>e, talvez o mais importante: aplicamos a Regulariza\u00e7\u00e3o Harm\u00f4nica, que garante que os pesos n\u00e3o mudem significativamente em rela\u00e7\u00e3o ao modelo antigo.\n<\/li>\n<\/ul>\n<p>\nComo cada componente da perda possui coeficientes, podemos ajustar os valores ideais para nossa tarefa por meio de valida\u00e7\u00e3o cruzada ou com base nas exig\u00eancias do produto.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/00ae86d23afb780f5e260e61f833d4bd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00c1rvores<\/h3>\n<p>\nVamos passar para as \u00e1rvores de decis\u00e3o. Desenvolvemos o seguinte algoritmo de ajuste para as \u00e1rvores:<\/p>\n<ol>\n<li>Em produ\u00e7\u00e3o, temos uma floresta de 100 a 300 \u00e1rvores, treinada em um conjunto de dados antigo.\n<\/li>\n<li>Removemos no final M = 5 \u00e1rvores e adicionamos 2M = 10 novas, treinadas em todo o conjunto de dados, mas com alto peso para os novos dados, o que naturalmente garante uma mudan\u00e7a incremental no modelo.\n<\/li>\n<\/ol>\n<p>\n\u00c9 evidente que, com o tempo, o n\u00famero de \u00e1rvores aumenta significativamente, e elas precisam ser periodicamente diminu\u00eddas para se manter dentro dos prazos. Para isso, utilizamos a onipresente hoje Distila\u00e7\u00e3o do Conhecimento (KD). Um breve resumo do seu funcionamento.<\/p>\n<ol>\n<li>Temos o modelo atual \"complexo\". Executamos ele em um conjunto de dados de treinamento e obtemos a distribui\u00e7\u00e3o de probabilidades das classes na sa\u00edda.\n<\/li>\n<li>Em seguida, ensinamos o modelo aluno (um modelo com um n\u00famero menor de \u00e1rvores, neste caso) a repetir os resultados do modelo, usando a distribui\u00e7\u00e3o das classes como vari\u00e1vel alvo.\n<\/li>\n<li>\u00c9 importante notar que n\u00e3o usamos a marca\u00e7\u00e3o do conjunto de dados, e por isso podemos utilizar dados arbitr\u00e1rios. Certamente, utilizamos amostras de dados do fluxo de produ\u00e7\u00e3o como conjunto de treinamento para o modelo aprendiz. Dessa forma, o conjunto de treinamento nos permite garantir a precis\u00e3o do modelo, enquanto a amostra do fluxo garante desempenho semelhante na distribui\u00e7\u00e3o de produ\u00e7\u00e3o, compensando o vi\u00e9s do conjunto de treinamento.\n<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/3fdfcb9b1e5a6fa824226a429afc475a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA combina\u00e7\u00e3o dessas duas metodologias (adi\u00e7\u00e3o de \u00e1rvores e a redu\u00e7\u00e3o peri\u00f3dica de seu n\u00famero atrav\u00e9s da Knowledge Distillation) assegura a introdu\u00e7\u00e3o de novos padr\u00f5es e continuidade total.<\/p>\n<p>Com a KD, tamb\u00e9m realizamos opera\u00e7\u00f5es de diferencia\u00e7\u00e3o com caracter\u00edsticas do modelo, como a remo\u00e7\u00e3o de caracter\u00edsticas e o trabalho com faltas. No nosso caso, temos uma s\u00e9rie de caracter\u00edsticas estat\u00edsticas importantes (por remetentes, hashes de texto, URLs, etc.) que s\u00e3o armazenadas em uma base de dados que pode falhar. A modelo, naturalmente, n\u00e3o est\u00e1 preparado para tal situa\u00e7\u00e3o, pois o conjunto de treinamento n\u00e3o inclui cen\u00e1rios de falha. Nesses casos, combinamos as t\u00e9cnicas de KD e aumento: durante o treinamento, para parte dos dados, removemos ou zeramos as caracter\u00edsticas necess\u00e1rias, enquanto as etiquetas (sa\u00eddas do modelo atual) s\u00e3o as originais, e o modelo aprendiz aprende a repetir essa distribui\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/5e1f5af9a359646a49f4fe88ffed1025.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nObservamos que quanto mais s\u00e9ria a manipula\u00e7\u00e3o dos modelos, mais porcentagem de amostra do fluxo \u00e9 necess\u00e1ria.<\/p>\n<p>Para remover caracter\u00edsticas, a opera\u00e7\u00e3o mais simples, exige apenas uma pequena parte do fluxo, j\u00e1 que apenas algumas caracter\u00edsticas mudam e o modelo atual foi treinado no mesmo conjunto \u2014 a diferen\u00e7a \u00e9 m\u00ednima. Para simplificar o modelo (reduzindo o n\u00famero de \u00e1rvores v\u00e1rias vezes), j\u00e1 se requer um equil\u00edbrio de 50 a 50. E para as faltas de caracter\u00edsticas estat\u00edsticas importantes, que afetam seriamente o desempenho do modelo, \u00e9 necess\u00e1rio ainda mais fluxo para equilibrar o funcionamento do novo modelo resistente a faltas em todos os tipos de e-mails. <\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/8f3729cfff43be9ecdc47d532daa8d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>FastText<\/h3>\n<p>\nVamos falar sobre o FastText. Lembro que a representa\u00e7\u00e3o (embedding) de uma palavra \u00e9 composta pela soma do embedding da pr\u00f3pria palavra e todos os seus N-grams, geralmente trigramas. Como podem existir muitos trigramas, utiliza-se o Bucket Hashing, ou seja, a transforma\u00e7\u00e3o de todo o espa\u00e7o em um determinado hash map fixo. Como resultado, a matriz de pesos tem dimens\u00f5es da camada interna multiplicadas pelo n\u00famero de palavras mais buckets. <\/p>\n<p>No fine-tuning surgem novas caracter\u00edsticas: palavras e trigramas. No fine-tuning padr\u00e3o do Facebook, nada de significativo acontece. Apenas os pesos antigos s\u00e3o ajustados com entropia cruzada em novos dados. Dessa forma, as novas caracter\u00edsticas n\u00e3o s\u00e3o utilizadas, e esse m\u00e9todo, claro, apresenta todas as desvantagens descritas anteriormente relacionadas \u00e0 imprevisibilidade do modelo em produ\u00e7\u00e3o. Portanto, ajustamos um pouco o FastText. Adicionamos todos os novos pesos (palavras e trigramas), treinamos toda a matriz com entropia cruzada e aplicamos a regulariza\u00e7\u00e3o harm\u00f4nica, de forma an\u00e1loga ao modelo linear, que garante que os pesos antigos n\u00e3o sejam alterados de forma significativa.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/4491639587d1c91ac91d77b587ee0111.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>CNN<\/h3>\n<p>\nCom redes convolucionais \u00e9 um pouco mais complicado. Se, em uma CNN, as \u00faltimas camadas s\u00e3o ajustadas, obviamente, a regulariza\u00e7\u00e3o harm\u00f4nica pode ser aplicada e garantir a continuidade. Mas quando \u00e9 necess\u00e1rio realizar o fine-tuning de toda a rede, essa regulariza\u00e7\u00e3o n\u00e3o pode ser aplicada a todas as camadas. No entanto, existe a op\u00e7\u00e3o de treinar embeddings complementares atrav\u00e9s do Triplet Loss (<noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1503.03832\">artigo original<\/a><\/noindex>).<\/p>\n<h4>Triplet Loss<\/h4>\n<p>\nNo exemplo da tarefa de anti-phishing, analisamos de forma geral o Triplet Loss. Pegamos nosso logotipo, assim como exemplos positivos e negativos de logotipos de outras empresas. Minimiza-se a dist\u00e2ncia entre os primeiros e maximiza-se a dist\u00e2ncia entre os segundos, fazendo isso com uma pequena margem para garantir uma maior compacta\u00e7\u00e3o das classes. <\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/dc8547fa042286798eb5c2f0887c4da6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSe ajustamos a rede, o espa\u00e7o m\u00e9trico muda completamente e se torna absolutamente incompat\u00edvel com o anterior. Esse \u00e9 um problema s\u00e9rio em tarefas que utilizam vetores. Para contornar esse problema, devemos misturar embeddings antigos durante o treinamento.<\/p>\n<p>Adicionamos novos dados ao conjunto de treinamento e estamos reensinando do zero a segunda vers\u00e3o do modelo. Na segunda fase, realizamos o fine-tuning da nossa rede: inicialmente, apenas a \u00faltima camada \u00e9 treinada, e, em seguida, toda a rede \u00e9 destravada. Durante a forma\u00e7\u00e3o dos tripletos, apenas uma parte dos embeddings \u00e9 calculada com o modelo trein\u00e1vel, enquanto o restante \u00e9 feito com o modelo antigo. Dessa forma, durante o fine-tuning, garantimos a compatibilidade entre os espa\u00e7os m\u00e9tricos v1 e v2. \u00c9 uma esp\u00e9cie de variante de regulariza\u00e7\u00e3o harm\u00f4nica.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/854d4fcc97775b24e6863cc38743cd27.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Arquitetura como um todo<\/h3>\n<p>\nQuando olhamos para todo o sistema como um exemplo de anti-spam, notamos que os modelos n\u00e3o est\u00e3o isolados, mas sim aninhados uns dentro dos outros. Pegamos imagens, texto e outros atributos, e, utilizando CNN e Fast Text, obtemos embeddings. Em seguida, classificadores s\u00e3o aplicados sobre os embeddings, que geram scores para diferentes classes (tipos de emails, spam, presen\u00e7a de logotipo). Os scores e atributos ent\u00e3o entram na floresta de \u00e1rvores para a decis\u00e3o final. Classificadores separados nesse esquema permitem uma melhor interpreta\u00e7\u00e3o dos resultados do sistema e um fine-tuning mais direcionado dos componentes em caso de problemas, em vez de simplesmente alimentar todos os dados brutos nas \u00e1rvores de decis\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/30effc5ef7398db5f085b6dd415647d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo final, garantimos a continuidade em cada n\u00edvel. No n\u00edvel inferior, em CNN e Fast Text, usamos regulariza\u00e7\u00e3o harm\u00f4nica; para os classificadores do meio, tamb\u00e9m usamos regulariza\u00e7\u00e3o harm\u00f4nica e calibra\u00e7\u00e3o das pontua\u00e7\u00f5es para compatibilidade da distribui\u00e7\u00e3o de probabilidade. Por sua vez, o boosting das \u00e1rvores \u00e9 treinado de forma incremental ou atrav\u00e9s de Knowledge Distillation.<\/p>\n<p>No geral, dar suporte a um sistema de aprendizado de m\u00e1quina t\u00e3o aninhado costuma ser complicado, pois qualquer componente no n\u00edvel inferior leva \u00e0 atualiza\u00e7\u00e3o de todo o sistema acima. Contudo, como em nossa configura\u00e7\u00e3o cada componente muda minimamente e \u00e9 compat\u00edvel com o anterior, todo o sistema pode ser atualizado em partes, sem a necessidade de reencontrar toda a estrutura, o que permite mant\u00ea-lo sem um grande overhead. <\/p>\n<h2>Deploy<\/h2>\n<p>\nDiscutimos a coleta de dados e o fine-tuning de diferentes tipos de modelos, agora vamos ao seu deploy no ambiente de produ\u00e7\u00e3o.<\/p>\n<h3>A\/B testing<\/h3>\n<p>\nComo mencionei anteriormente, durante o processo de coleta de dados, geralmente obtemos uma amostra distorcida, a qual torna imposs\u00edvel avaliar o desempenho real da produ\u00e7\u00e3o do modelo. Portanto, ao implementar o modelo, \u00e9 imprescind\u00edvel compar\u00e1-lo com a vers\u00e3o anterior para entender como realmente as coisas est\u00e3o, ou seja, realizar testes A\/B. De fato, o processo de lan\u00e7amento e an\u00e1lise dos gr\u00e1ficos \u00e9 bastante rotineiro e se presta bem a automatiza\u00e7\u00e3o. Liberamos nossos modelos gradualmente para 5%, 30%, 50% e 100% dos usu\u00e1rios, enquanto reunimos todas as m\u00e9tricas dispon\u00edveis sobre as respostas do modelo e o feedback dos usu\u00e1rios. Caso haja alguns picos s\u00e9rios, revertamos automaticamente o modelo, e para os demais casos, ap\u00f3s termos um n\u00famero suficiente de cliques dos usu\u00e1rios, tomamos a decis\u00e3o de aumentar a porcentagem. Assim, conseguimos levar o novo modelo at\u00e9 50% dos usu\u00e1rios de forma totalmente autom\u00e1tica, e a implementa\u00e7\u00e3o para todo o p\u00fablico \u00e9 aprovada por uma pessoa, embora este passo tamb\u00e9m possa ser automatizado.<\/p>\n<p>No entanto, o processo de testes A\/B apresenta oportunidades para otimiza\u00e7\u00e3o. O fato \u00e9 que qualquer teste A\/B \u00e9 bastante longo (no nosso caso, leva de 6 a 24 horas dependendo da quantidade de feedback), o que o torna bastante caro e com recursos limitados. Al\u00e9m disso, \u00e9 necess\u00e1rio um percentual bastante elevado de fluxo para o teste, a fim de, essencialmente, acelerar o tempo total do teste A\/B (coletar uma amostra estatisticamente significativa para avaliar m\u00e9tricas com uma pequena porcentagem pode levar muito tempo), o que torna o n\u00famero de slots A\/B extremamente limitado. \u00c9 evidente que precisamos levar ao teste apenas os modelos mais promissores, dos quais, durante o processo de ajuste fino, obtemos bastante ao longo.<\/p>\n<p>Para resolver essa tarefa, treinamos um classificador separado que prev\u00ea o sucesso do teste A\/B. Para isso, usamos como caracter\u00edsticas a estat\u00edstica de decis\u00f5es, Precision, Recall e outras m\u00e9tricas em um conjunto de treinamento, em um conjunto separado e em uma amostra do fluxo. Tamb\u00e9m comparamos o modelo com o atual em produ\u00e7\u00e3o, com heur\u00edsticas, e levamos em conta a complexidade (Complexity) do modelo. Usando todas essas caracter\u00edsticas, o classificador treinado com o hist\u00f3rico dos testes avalia os modelos candidatos, que no nosso caso s\u00e3o florestas de \u00e1rvores, e toma a decis\u00e3o sobre qual deles liberar para o teste A\/B. <\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/41b121987209a663075be399e83f5a50.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa implementa\u00e7\u00e3o, essa abordagem permitiu aumentar v\u00e1rias vezes o n\u00famero de testes A\/B bem-sucedidos.<\/p>\n<h3>Testes &amp; monitoramento<\/h3>\n<p>\nTestar e monitorar, estranhamente, n\u00e3o prejudica nossa sa\u00fade; pelo contr\u00e1rio, melhora e alivia o estresse. O teste ajuda a prevenir falhas, enquanto o monitoramento permite detect\u00e1-las a tempo, minimizando o impacto nos usu\u00e1rios.<\/p>\n<p>Aqui \u00e9 importante entender que, mais cedo ou mais tarde, seu sistema sempre errar\u00e1 \u2014 isso est\u00e1 relacionado ao ciclo de desenvolvimento de qualquer software. No in\u00edcio do desenvolvimento, sempre h\u00e1 muitos bugs at\u00e9 que tudo se estabilize e a fase principal de inova\u00e7\u00f5es seja conclu\u00edda. Mas com o tempo, a entropia se imp\u00f5e e novos erros surgem \u2014 devido \u00e0 degrada\u00e7\u00e3o dos componentes ao redor e \u00e0s mudan\u00e7as nos dados, sobre as quais j\u00e1 mencionei.<\/p>\n<p>Aqui gostaria de salientar que qualquer sistema de aprendizado de m\u00e1quina deve ser avaliado em termos de seu benef\u00edcio ao longo de todo o ciclo de vida. Abaixo, o gr\u00e1fico mostra um exemplo de como funciona um sistema de detec\u00e7\u00e3o de um tipo raro de spam (no gr\u00e1fico, a linha est\u00e1 pr\u00f3xima de zero). Em uma ocasi\u00e3o, devido a uma caracter\u00edstica mal armazenada em cache, o sistema pirou. Como por ironia, n\u00e3o havia monitoramento para detectar ativa\u00e7\u00e3o an\u00f4mala, resultando no sistema come\u00e7ar a salvar e-mails na pasta 'spam' no limite da tomada de decis\u00e3o em grande quantidade. Apesar de corrigir as consequ\u00eancias, o sistema j\u00e1 falhou tantas vezes que n\u00e3o se pagar\u00e1 nem em cinco anos. E isso \u00e9 um fracasso total em termos do ciclo de vida do modelo. <\/p>\n<p><img decoding=\"async\" alt=\"Implementa\u00e7\u00e3o de machine learning no Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/65efd799537ceea3761cabc3a764ba90.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPor isso, uma coisa t\u00e3o simples como monitoramento pode se tornar crucial na vida do modelo. Al\u00e9m das m\u00e9tricas padr\u00e3o e \u00f3bvias, consideramos a distribui\u00e7\u00e3o das respostas e dos scores do modelo, assim como a distribui\u00e7\u00e3o dos valores das caracter\u00edsticas chave. Com a diverg\u00eancia KL, podemos comparar a distribui\u00e7\u00e3o atual com a hist\u00f3rica ou os valores no teste A\/B com o restante do fluxo, permitindo identificar anomalias no modelo e reverter mudan\u00e7as a tempo.<\/p>\n<p>Na maioria das vezes, lan\u00e7amos nossas primeiras vers\u00f5es de sistemas usando heur\u00edsticas simples ou modelos que, no futuro, utilizamos para monitoramento. Por exemplo, monitorando um modelo NER em compara\u00e7\u00e3o com express\u00f5es regulares para lojas de com\u00e9rcio eletr\u00f4nico espec\u00edficas, e se a cobertura do classificador cair em rela\u00e7\u00e3o a elas, investigamos as raz\u00f5es. Mais uma aplica\u00e7\u00e3o \u00fatil das heur\u00edsticas!<\/p>\n<h2>Resultados<\/h2>\n<p>\nVamos passar novamente pelos principais pontos do artigo.<\/p>\n<ul>\n<li><b>Fibdac<\/b>. Sempre pensamos no usu\u00e1rio: como ele lidar\u00e1 com nossos erros, como poder\u00e1 report\u00e1-los. N\u00e3o devemos esquecer que os usu\u00e1rios n\u00e3o s\u00e3o uma fonte pura de feedback para treinar modelos, e \u00e9 necess\u00e1rio filtrar isso com a ajuda de sistemas de ML auxiliares. Se n\u00e3o for poss\u00edvel coletar um sinal do usu\u00e1rio, buscamos fontes alternativas de feedback, como sistemas relacionados. \n<\/li>\n<li><b>Aprimoramento<\/b>. Aqui, o principal \u00e9 a continuidade, por isso nos baseamos no modelo de produ\u00e7\u00e3o atual. Treinamos novos modelos de forma que n\u00e3o se diferenciem muito do anterior, usando regulariza\u00e7\u00e3o harm\u00f4nica e truques semelhantes.<\/li>\n<li><b>Deploy<\/b>. A autoimplanta\u00e7\u00e3o baseada em m\u00e9tricas reduz significativamente o tempo de implementa\u00e7\u00e3o de modelos. O monitoramento de estat\u00edsticas e a distribui\u00e7\u00e3o de decis\u00f5es, bem como a quantidade de falsos positivos dos usu\u00e1rios, s\u00e3o essenciais para sua tranquilidade e fins de semana produtivos.\n<\/li>\n<\/ul>\n<p>\nBem, espero que o que voc\u00ea leu ajude a melhorar mais rapidamente seus sistemas de ML, acelerando seu lan\u00e7amento no mercado e tornando-os mais confi\u00e1veis, reduzindo o estresse do trabalho.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/476714\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 Highload++ \u0438 DataFest Minsk 2019 \u0433. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0447\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0436\u0438\u0437\u043d\u0438 \u0432 \u0441\u0435\u0442\u0438. \u0421 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u0432\u0435\u0434\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0443, \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438, \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442\u0435\u043b\u0435\u0439, \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u0438\u043c \u0434\u0440\u0443\u0433\u0438\u043c. \u0412 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 2018 \u0433\u043e\u0434\u0430 \u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u043e\u0447\u0442\u044b. \u041a\u0430\u043a\u043e\u0439 \u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53143","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u041f\u043e\u0447\u0442\u0435 Mail.ru | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-23T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:00+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 A implementa\u00e7\u00e3o de aprendizado de m\u00e1quina na Mail.ru | ProHoster","description":"Baseado nas minhas apresenta\u00e7\u00f5es em.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u041f\u043e\u0447\u0442\u0435 Mail.ru | ProHoster","og:description":"\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-23T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:00+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53143","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 06:14:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:30:25","updated":"2026-01-24 06:14:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/53143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=53143"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/53143\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=53143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=53143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=53143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}