;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Estudo sobre erros das IAs encontrou até bebê que "virou" mamilo

Este bebê foi confundido com um mamilo em conclusão de estudo do MIT  - Reprodução/ImageNet
Este bebê foi confundido com um mamilo em conclusão de estudo do MIT Imagem: Reprodução/ImageNet

Aurélio Araújo

Colaboração para Tilt

29/03/2021 16h21

A IA (inteligência artificial) é cada dia mais usada no cotidiano, mas isso não quer dizer que ela seja perfeita. Um novo estudo realizado pelo MIT (sigla em inglês para o Instituto de Tecnologia de Massachusetts) mostra que ela ainda comete erros grosseiros. Em um deles, um bebê chegou a ser confundido com um mamilo.

Um grupo de cientistas computacionais do MIT examinou dez dos conjuntos de dados mais usados para testar sistemas de aprendizado de máquina e viu 3,4% dos dados eram imprecisos ou mal rotulados, o que pode comprometer os resultados da IA de forma até grosseira.

Seis destes conjuntos de dados analisados trabalham com imagens. Um deles é o ImageNet, criado para treinar muitos algoritmos de visão computacional —ou seja, que treinam as máquinas para "ver" e interpretar imagens. A pesquisa incluiu também um conjunto de dados de análise de áudio e outros três para texto.

Os erros relacionados a imagens vão desde uma simples confusão entre diferentes espécies animais até identificar uma parte pelo todo: uma inteligência artificial classificou uma bicicleta "mountain bike" como uma garrafa d'água, só porque a bicicleta também carregava uma garrafa, por exemplo. Outro erro curioso foi um bebê confundido com um mamilo, em uma análise da ImageNet.

Alguns dos erros detectados pelo estudo estão no Amazon Reviews, que analisa comentários do público sobre produtos vendidos no site da Amazon. Comentários positivos foram lidos pela inteligência artificial como negativos, e vice-versa.

Ao analisar os conjuntos de dados de vídeos do YouTube, o estudo notou que um clipe de um youtuber falando com a câmera foi classificado como sendo o som de sinos de igreja, apenas porque, durante essa fala, é possível ouvir um sino tocando nos últimos 30 segundos. Em outra situação, um show do cantor Bruce Springsteen foi classificado como sendo de uma orquestra.

Dos conjuntos analisados, o QuickDraw —rede neural do Google usada para reconhecer desenhos à mão— apresentou o maior percentual de erros, com 10,12% do total, seguido da CIFAR (5,85%) e da ImageNet (5,83%). Já o conjunto de dados do Amazon Reviews apresentou 4% de erros.

Metodologia

Para encontrar esses erros, os pesquisadores usaram uma técnica chamada "confident learning" (aprendizado seguro, em tradução livre), que busca informações irrelevantes em conjuntos de dados.

Depois, validaram os erros possíveis e concluíram que 54% dos dados que o algoritmo marcou estavam rotulados erroneamente. Em seguida, criaram um site para mostrar os erros de identificação encontrados.

Mesmo com alguns dos erros sendo aparentemente pequenos, eles podem desencadear uma série de falhas maiores nos sistemas de aprendizado de máquina. Por isso, o uso de IA ainda precisa de muito trabalho humano para conseguir assumir tarefas delicadas de análise de dados com uma margem de erro mais segura.