Aprendizado de máquina e redes neurais - página 64

 

Otimização Bayesiana de Hiperparâmetros



Otimização Bayesiana de Hiperparâmetros

Olá a todos, meu nome é Aaron, e hoje estarei discutindo a otimização de hiperparâmetro bayesiano. As informações que vou compartilhar são baseadas no trabalho do professor Roger Gross, da Universidade de Toronto. Embora eu seja relativamente novo neste tópico, acredito que seja essencial destacar a importância dos métodos automáticos para o ajuste de hiperparâmetros. Recentemente, encontrei um artigo da DeepMind sobre modelagem de linguagem que demonstrou a importância do ajuste cuidadoso de hiperparâmetros. Seus resultados superaram outros modelos de última geração simplesmente porque eles investiram mais esforço na otimização de hiperparâmetros. Como pesquisadores, é crucial ser proficiente em ajuste de hiperparâmetros para avaliar e comparar modelos diferentes com precisão.

As armadilhas do ajuste insuficiente de hiperparâmetros: O ajuste de hiperparâmetros não é uma habilidade inerente aos humanos. Sem o ajuste adequado, pode-se publicar inadvertidamente modelos que não são realmente superiores aos resultados da linha de base. Para evitar isso, é necessário investir tempo e esforço na otimização de hiperparâmetros. Além disso, o melhor desempenho só pode ser alcançado com o domínio dessa habilidade. Para começar, é crucial abordar o ajuste de hiperparâmetros com a mente aberta. Em vez de fazer julgamentos preconcebidos sobre os valores dos parâmetros, é aconselhável explorar toda a gama de possibilidades. Aprendi com a experiência que limitar prematuramente o espaço de parâmetros pode levar a desperdício de tempo e modelos ineficazes.

O problema com a pesquisa em grade: A pesquisa em grade, uma abordagem popular para otimização de hiperparâmetros, não é recomendada. Suas falhas ficam aparentes quando se considera a praticidade do processo. Os modelos do mundo real geralmente têm vários hiperparâmetros, alguns dos quais são mais influentes do que outros. Se a pesquisa em grade for empregada, duplicatas dos mesmos pontos podem ser geradas no subespaço dos hiperparâmetros relevantes. Essas duplicatas diferem apenas em termos de parâmetros irrelevantes, resultando em trabalho redundante. Assim, a pesquisa de grade pode ser altamente ineficiente ao determinar quais parâmetros são irrelevantes. A busca aleatória, por outro lado, oferece uma alternativa simples. Ao selecionar aleatoriamente valores de hiperparâmetros, os pesquisadores podem mitigar essa redundância e melhorar seu processo de otimização. Existem métodos avançados, mas normalmente oferecem apenas melhorias marginais em relação à pesquisa aleatória. Portanto, investir mais tempo na busca aleatória pode produzir resultados comparáveis.

Dicas para otimização de hiperparâmetro eficaz: Além de usar a pesquisa aleatória, existem algumas outras estratégias para otimizar hiperparâmetros de forma eficaz. Uma abordagem é eliminar hiperparâmetros que podem ser determinados ou definidos com base em conhecimento prévio ou outros procedimentos. Ao reduzir o número de parâmetros, o processo de otimização se torna mais gerenciável. Também é importante notar que a maioria dos artigos publicados geralmente não são ajustados corretamente. Alcançar um ajuste preciso requer a realização de vários experimentos, que podem consumir muito tempo. Portanto, os pesquisadores devem estar preparados para dedicar um tempo significativo para alcançar os melhores resultados possíveis.

Estimativa de hiperparâmetros bayesianos: agora vamos nos aprofundar no tópico de estimativa de parâmetros bayesianos para ajuste de hiperparâmetros. Os hiperparâmetros englobam todas as variáveis que não podem ser aprendidas como parte do próprio modelo, incluindo tamanho do modelo, regularização, taxa de aprendizado, duração do treinamento, entre outros. Normalmente, um conjunto de validação é usado para selecionar parâmetros e seu desempenho é avaliado de acordo. No entanto, como esse processo carece de gradientes, ele difere do problema de aprendizado primário resolvido usando retropropagação. Além disso, devido ao custo computacional de avaliar cada experimento, é essencial ser estratégico na seleção de combinações de hiperparâmetros.

Regressão bayesiana como ferramenta: A regressão bayesiana é uma ferramenta útil que ajuda a quantificar o desempenho esperado e a incerteza associada a diferentes regiões do espaço de hiperparâmetros. Ao ajustar uma distribuição de probabilidade a funções possíveis, a regressão bayesiana oferece uma abordagem mais sutil em comparação com o simples ajuste de uma única linha aos dados. Inicialmente, sem observações, as funções amostrais aparecem dispersas. No entanto, à medida que mais observações são feitas, a distribuição das funções se estreita, refletindo maior certeza.

Outro aspecto importante da otimização de hiperparâmetros é a necessidade de eliminar tantos hiperparâmetros quanto possível. Se houver uma maneira de determinar o valor de um hiperparâmetro com base em algum conhecimento prévio ou por meio de outro procedimento, é uma boa ideia defini-lo de acordo. Quanto mais hiperparâmetros você tiver, mais difícil será otimizá-los com eficácia. Ao reduzir o número de hiperparâmetros, você simplifica o processo de otimização e o torna mais gerenciável.

Também é importante notar que a maioria dos trabalhos publicados na área não está devidamente sintonizada. Alcançar o ajuste adequado requer um número substancial de experimentos a serem conduzidos, muito mais do que os pesquisadores costumam realizar. Se você realmente deseja observar padrões e reunir evidências para dar suporte a valores de parâmetros específicos, esteja preparado para investir uma quantidade significativa de tempo no processo de ajuste.

Agora vamos voltar aos slides de Roger Gross. O foco da apresentação é a estimativa de hiperparâmetro bayesiano para ajustar hiperparâmetros. Os hiperparâmetros referem-se a todas as variáveis que não podem ser aprendidas como parte do modelo e descrevem o modelo escolhido, como tamanho do modelo, regularização, taxa de aprendizado e duração do treinamento. A seleção de hiperparâmetros apropriados é crucial para alcançar o desempenho ideal do modelo.

A abordagem tradicional para ajuste de hiperparâmetros, pesquisa em grade, não é recomendada devido à sua ineficiência. A pesquisa de grade geralmente resulta em avaliações redundantes de combinações de hiperparâmetros e não leva em conta a relevância de cada hiperparâmetro. Em vez disso, é aconselhável explorar o espaço de hiperparâmetros de forma mais eficaz. A busca aleatória pode ser uma alternativa simples à busca em grade, mas existem métodos ainda mais avançados disponíveis, que serão discutidos.

O palestrante enfatiza a importância de começar com a mente aberta e considerar toda a gama de possíveis valores de hiperparâmetros. Fazer pré-julgamentos sobre faixas de hiperparâmetros pode levar a resultados abaixo do ideal e perda de tempo. É essencial evitar a pesquisa em grade como um método de pesquisa de hiperparâmetros, uma vez que duplica o trabalho e não identifica os hiperparâmetros relevantes com precisão. A seleção aleatória de hiperparâmetros pode ser uma alternativa razoável, pois fornece uma boa linha de base.

No entanto, métodos mais avançados, como a regressão bayesiana, podem oferecer resultados ainda melhores. A regressão bayesiana permite modelar o espaço de hiperparâmetros e estimar o desempenho esperado e a incerteza associada a cada configuração de hiperparâmetro. O modelo de regressão considera todos os valores possíveis de hiperparâmetros em vez de focar em pontos individuais, o que leva a uma tomada de decisão mais informada.

Para selecionar o próximo conjunto de hiperparâmetros a explorar, o apresentador apresenta o conceito de uma função de aquisição. A função de aquisição quantifica a melhoria esperada no desempenho e a incerteza no espaço de hiperparâmetros. Ele equilibra exploração e exploração, com o objetivo de encontrar configurações de hiperparâmetros que provavelmente sejam boas, mas também inexploradas.

O palestrante destaca que, embora os slides representem exemplos unidimensionais, o espaço de hiperparâmetros é normalmente muito mais dimensional, tornando a visualização um desafio. A regressão bayesiana pode ser aplicada a espaços de dimensão superior usando técnicas como processos gaussianos. Existem diferentes abordagens de modelagem e as escolhas devem ser baseadas em considerações como custo computacional e o problema específico em questão.

Para avaliar o desempenho de vários métodos de otimização de hiperparâmetros, são realizados experimentos, e o método que atinge o melhor desempenho com o menor número de experimentos é considerado o mais eficaz. As comparações são feitas contra suposições de especialistas humanos e pesquisa aleatória, onde os métodos avançados superam consistentemente essas linhas de base.

Em conclusão, a otimização de hiperparâmetro bayesiano oferece uma abordagem poderosa para melhorar o desempenho do modelo, explorando efetivamente o espaço de hiperparâmetros. Isso ajuda a evitar as armadilhas da pesquisa em grade e permite que os pesquisadores tomem decisões mais informadas com base no desempenho esperado e nas estimativas de incerteza. No entanto, é essencial considerar cuidadosamente o custo computacional, a relevância do hiperparâmetro e os objetivos gerais da pesquisa ao escolher o método de otimização de hiperparâmetro apropriado.

Lembre-se, esta apresentação é baseada nos insights de Roger Gross e fornece orientação valiosa sobre a importância da otimização de hiperparâmetros e os benefícios das técnicas Bayesianas. Recomenda-se consultar o artigo original ou pesquisas adicionais no campo para uma compreensão mais detalhada dos métodos e sua implementação.

Bayesian Hyperparameter Optimization
Bayesian Hyperparameter Optimization
  • 2017.08.17
  • www.youtube.com
#hangoutsonair, Hangouts On Air, #hoa
 

GANs



GANs

Há várias considerações ao usar redes adversárias generativas (GANs) para geração de imagens. As GANs têm prós e contras neste contexto. Uma vantagem significativa é que os GANs impõem naturalmente que a distribuição gerada seja semelhante à distribuição de destino sem exigir funções de perda complexas. Isto é conseguido através do jogo mini-max entre o gerador e o discriminador. As GANs fornecem uma boa maneira de codificar imagens realistas aprendendo a distribuição subjacente. No entanto, na prática, muitas vezes são necessárias perdas adicionais durante o treinamento do sistema.

Existem vários tipos de GANs usados para diferentes propósitos. GANs condicionais permitem gerar dados com base em distribuições de probabilidade condicional. Isso significa que, em vez de gerar a partir de uma única distribuição de probabilidade, o gerador pode ser condicionado a informações específicas. Outras variantes de GAN, como Pix2Pix e CycleGAN, concentram-se em tarefas de tradução de imagem para imagem. Esses modelos podem transformar imagens de um domínio para outro, permitindo tarefas como transferência de estilo ou síntese de imagem.

O treinamento de GANs pode ser desafiador e existem algumas dicas que podem ajudar a melhorar o processo de treinamento. É importante não desistir facilmente porque as GANs geralmente exigem várias iterações para convergir. A normalização das entradas de imagem entre -1 e 1 geralmente é benéfica, e a suavização de rótulos pode ser aplicada para melhorar a estabilidade do treinamento. Usar ruído gaussiano em vez de ruído distribuído uniformemente como entrada para o gerador também pode ser útil. Existem muitas outras dicas disponíveis para treinamento de GANs, e recursos como repositórios do GitHub podem fornecer listas abrangentes.

Para ilustrar o uso prático de GANs, vejamos um exemplo de conversão de imagem para imagem usando o CycleGAN. Este modelo visa traduzir imagens de um domínio para outro sem a necessidade de amostras de treinamento explicitamente pareadas. Em vez disso, um conjunto de imagens de cada domínio é usado, e o objetivo é aprender duas transformações: uma do domínio X para o domínio Y e outra do domínio Y para o domínio X. O termo de consistência do ciclo é introduzido para garantir que a aplicação do avanço e as transformações inversas em uma imagem retornam a imagem original. O modelo combina múltiplas perdas, incluindo a perda de GAN e a perda de consistência do ciclo, para treinar os geradores e discriminadores.

A avaliação dos resultados pode ser feita através de vários métodos. Estudos mecânicos do Turk podem ser conduzidos, onde avaliadores humanos são solicitados a distinguir entre imagens reais e geradas. Além disso, métricas de avaliação específicas como Intersection over Union (IoU) podem ser usadas para medir a precisão dos mapas de segmentação gerados em comparação com os mapas originais.

Vale a pena notar que, embora os GANs tenham mostrado resultados promissores, ainda pode haver desafios em treiná-los. Colapso de modo, onde o gerador produz variações limitadas e problemas de preservação de cores estão entre as dificuldades que podem surgir. Os pesquisadores continuam a explorar e melhorar os modelos GAN para obter melhores resultados de geração de imagens.

Outra abordagem que tem sido explorada para melhorar o treinamento de GANs é chamada de crescimento progressivo. No treinamento GAN tradicional, o gerador e o discriminador são treinados simultaneamente nas mesmas imagens de resolução durante todo o processo de treinamento. No entanto, o crescimento progressivo tem uma abordagem diferente.

No crescimento progressivo, o treinamento começa com imagens de baixa resolução e aumenta progressivamente a resolução ao longo do tempo. A ideia por trás dessa abordagem é permitir que os modelos primeiro aprendam a estrutura básica e depois refinem gradualmente os detalhes à medida que a resolução aumenta. Isso ajuda a estabilizar o processo de treinamento e pode levar a melhores resultados.

Durante o treinamento de GANs progressivos, várias resoluções são usadas e novas camadas são adicionadas às redes geradora e discriminadora à medida que a resolução aumenta. Os modelos são treinados de maneira hierárquica, onde as camadas de resolução mais baixa são treinadas primeiro e, em seguida, as camadas de resolução mais alta são adicionadas e treinadas.

Começando com imagens de baixa resolução, os modelos podem aprender a estrutura global e gerar detalhes grosseiros. À medida que a resolução aumenta, os modelos podem se concentrar em capturar detalhes mais finos e produzir imagens mais realistas. Esse processo de treinamento passo a passo ajuda a evitar a instabilidade do treinamento e o colapso do modo, que são desafios comuns no treinamento GAN.

O crescimento progressivo demonstrou ser eficaz na geração de imagens de alta qualidade em vários domínios, como rostos, paisagens e objetos. Ele permite a geração de imagens com texturas mais realistas, detalhes mais nítidos e melhor qualidade visual geral.

Além do crescimento progressivo, existem outras técnicas e truques que podem ser usados para melhorar o treinamento do GAN. Uma dessas técnicas é o uso de métodos de regularização, como normalização de peso, normalização espectral e penalidade de gradiente, que ajudam a estabilizar o treinamento e evitar o colapso do modo.

Outra consideração importante é a escolha das funções de perda. Embora a perda adversária seja um componente-chave no treinamento GAN, ela geralmente é complementada com funções de perda adicionais para orientar o processo de aprendizado. Essas perdas adicionais podem incluir perda de percepção, perda de correspondência de recursos ou perda de reconstrução, dependendo da tarefa específica e da saída desejada.

Além disso, escolhas arquitetônicas, como arquitetura de rede, funções de ativação e algoritmos de otimização, também podem afetar o treinamento de GANs. Muitas vezes, a experimentação e o ajuste fino dessas escolhas são necessários para alcançar os melhores resultados.

No geral, o treinamento de GANs é uma tarefa complexa e desafiadora que requer consideração cuidadosa de vários fatores. Embora os GANs tenham mostrado um sucesso notável na geração de imagens realistas, a obtenção de resultados estáveis e de alta qualidade ainda continua sendo uma área ativa de pesquisa. Os avanços nas técnicas de treinamento, métodos de regularização e funções de perda continuam a ultrapassar os limites do que as GANs podem alcançar.

 

Algoritmos de Convolução Rápida



Algoritmos de Convolução Rápida

Meu nome é Tanner, e Dan me pediu para falar em seu seminário de aprendizado profundo e prática. No entanto, rapidamente percebi que não tinha muito conhecimento sobre aprendizado profundo. No entanto, decidi focar no aspecto prático do tópico. Então, intitulei minha palestra "Como aprendi a parar de me preocupar e amar o CDNN" ou "Como minhas circunvoluções ficam tão rápidas?" Eu queria enfatizar o lado prático das coisas.

Para começar, apresentei um fato divertido que os participantes poderiam compartilhar em sua próxima reunião de aprendizado profundo. Na verdade, os comnets não executam convoluções; eles realizam correlações. É uma diferença sutil que não afeta significativamente a discussão.

Em seguida, introduzi algumas notações que usaria ao longo da palestra. Em uma convolução típica, você tem um tamanho de lote (n) representando o número de imagens sendo processadas juntas. Há também um tamanho de kernel, que assumiremos como quadrado para simplificar. Além disso, há a largura e a altura de saída, que dependem das dimensões de entrada e do tamanho do kernel. Além disso, existem os canais de entrada (c) e os canais de saída (d).

Em seguida, expliquei o algoritmo de convolução ingênuo, que é a implementação mais direta. Esse algoritmo consiste em sete loops for aninhados. Enquanto os primeiros quatro loops podem ser paralelizados, os loops restantes (cinco a sete) representam um desafio porque modificam o mesmo valor de saída. Mesmo ao usar uma GPU, paralelizar esses loops não é trivial devido ao acesso à memória associado.

Para ilustrar o conceito, forneci um pequeno exemplo de uma entrada 4x4 com uma convolução 3x3, resultando em uma saída 2x2. Cada elemento de saída requer nove multiplicações e calcular todos os quatro valores de saída requer 36 multiplicações.

Em seguida, introduzi a forma matricial Toeplitz do problema, que representa o cálculo da convolução na forma matricial. Este formulário demonstra a economia de parâmetros alcançada por meio do compartilhamento de peso e a presença de muitos zeros devido às interações seletivas de peso. No entanto, essa representação de matriz apresenta desafios de memória para entradas e saídas maiores.

Para resolver isso, discuti uma abordagem alternativa usada pelo Cafe, em que a entrada é replicada em vez do kernel. Ao criar uma representação de matriz da entrada, o cálculo da convolução pode ser executado de forma eficiente usando a multiplicação de matrizes. A vantagem dessa abordagem é que ela pode ser terceirizada para bibliotecas como CuBLAS, que podem paralelizar os cálculos e fazer uso de hardware otimizado.

Também destaquei uma técnica de streaming que divide a computação em partes menores, permitindo a sobreposição entre a computação e a transferência de dados. Essa abordagem ajuda a atenuar as limitações de memória e melhora o desempenho geral.

Seguindo em frente, discuti o progresso feito na visão computacional revisitando artigos da década de 1980. Inspirando-se em técnicas de processamento de sinal, especificamente redução de força algorítmica, os pesquisadores conseguiram melhorar a velocidade das convoluções.

Expliquei o conceito da teoria de filtragem mínima, que afirma que uma convolução 1D com um tamanho de filtro (k) e uma largura de saída (w) pode ser alcançada com apenas w + k - 1 multiplicações. Essa redução nas multiplicações pode ser obtida reorganizando o cálculo e introduzindo valores intermediários que permitem mais adições em vez de multiplicações.

Forneci um exemplo do algoritmo de Weiner-Grassmann, que mostra como uma convolução 1D pode ser organizada para minimizar as multiplicações. Aplicando esse algoritmo, podemos reduzir o número de multiplicações necessárias para uma determinada convolução.

Esses conceitos também podem ser estendidos para convoluções 2D, onde a convolução 1D mínima pode ser aninhada dentro da convolução 2D mínima. Demonstrei esse aninhamento e expliquei como matrizes específicas são necessárias para diferentes tamanhos de entrada e kernel.

Neste cenário específico, onde temos uma convolução três por três e uma entrada quatro por quatro, as matrizes para a abordagem de redução algorítmica ficariam assim:

Uma matriz:

[ 1 0 -1 0 1 0 -1 0 ]
[ 0 1 1 0 0 -1 -1 0 ]
[ 0 1 -1 0 0 -1 1 0 ]
[ 0 0 0 1 -1 -1 1 0 ]

matriz G:

[1 0 0 -1]
[0 1 -1 0]
[-1 0 0 1]
[0 -1 1 0]

Matriz B:

[ 1 0 -1 0 ]
[ 0 1 1 0 ]
[ 0 1 -1 0 ]
[ 0 0 0 1 ]

Com essas matrizes, podemos calcular a saída usando multiplicações e adições de matrizes. Ao reorganizar os cálculos dessa maneira, reduzimos o número de multiplicações necessárias.

Portanto, a abordagem de redução de força algorítmica nos permite realizar a convolução usando menos multiplicações, o que pode levar a melhorias significativas na velocidade. Explorando as propriedades da operação de convolução e aplicando técnicas de processamento de sinal, podemos obter cálculos mais rápidos e eficientes.

Vale a pena notar que essas técnicas são apenas um vislumbre do vasto campo de aprendizado profundo e redes neurais convolucionais. Existem muitas outras otimizações e avanços que foram feitos para melhorar a velocidade e a eficiência das convoluções, como o uso de hardware especializado como GPUs ou TPUs, implementação de técnicas de paralelização e exploração de diferentes abordagens algorítmicas.

Em conclusão, o aprendizado profundo e as redes neurais convolucionais revolucionaram o campo da visão computacional e se tornaram ferramentas essenciais para uma ampla gama de aplicações. Compreender os princípios e técnicas subjacentes, como a redução da força algorítmica, pode nos ajudar a otimizar e melhorar o desempenho dos modelos de aprendizado profundo, permitindo avanços ainda mais empolgantes no futuro.

Fast Convolution Algorithms
Fast Convolution Algorithms
  • 2017.08.17
  • www.youtube.com
#hangoutsonair, Hangouts On Air, #hoa
 

Aprendizado por Reforço Profundo



Aprendizado por Reforço Profundo

Antes de começarmos, vamos fazer uma enquete rápida para ver quem aqui trabalha ativamente com aprendizado profundo há menos de um ano. Levante a mão se você se enquadra nessa categoria. Agora, e aqueles que trabalham com deep learning há menos de seis meses? Ótimo! E, finalmente, quem de vocês usa o aprendizado profundo por um período mais longo, mais de um ano? Excelente, temos alguns indivíduos experientes aqui também.

Agora, gostaria de começar compartilhando uma pequena história de minha própria jornada. Estou trabalhando em aprendizado profundo há cerca de uma semana, que foi na época em que Daniel iniciou este grupo. Lembro que ele incentivava todo mundo a apresentar seus trabalhos e, mesmo não tendo muito o que mostrar naquele momento, decidi participar mesmo assim. Avançando para hoje, posso dizer com orgulho que fiz um progresso significativo em apenas uma semana. Quero compartilhar minhas experiências e o que conquistei durante esse tempo. Isso será interessante para quem é novo no aprendizado profundo e também para quem tem curiosidade sobre o PyTorch.

Então, o que eu tenho feito na última semana? Para começar, comecei me familiarizando com os fundamentos do aprendizado profundo usando um exemplo simples do CIFAR-10. Para quem não sabe, o CIFAR-10 é um conjunto de dados composto por dez classes diferentes de imagens. Ele serve como uma introdução direta ao aprendizado profundo. O objetivo é treinar uma rede neural para prever a classe de uma imagem. Vou orientá-lo através de algum código para explicar o processo e destacar o que realmente estamos fazendo.

Vamos dar uma olhada no código. A primeira coisa que quero mencionar é como ele é conciso. Este arquivo contém apenas 140 linhas de código Python, o que é bastante impressionante, considerando que abrange tudo o que precisamos para o treinamento no CIFAR-10. Anteriormente, eu trabalhava com C de baixo nível e CUDA, então encontrar o PyTorch foi uma revelação. A estrutura do código é simples. Temos algumas transformações básicas de dados, um conjunto de trem e um carregador de trem, que são convenientemente fornecidos pelo módulo de visão da tocha. Este módulo nos permite baixar o conjunto de dados CIFAR-10 sem esforço. Definimos nossa rede, que consiste em camadas convolucionais e totalmente conectadas. O PyTorch cuida da retropropagação e fornece otimizadores integrados. Com apenas algumas linhas de código, podemos começar a treinar o modelo no CIFAR-10.

Seguindo em frente, quero discutir o aprendizado por reforço e sua aplicação ao aprendizado profundo. O aprendizado por reforço difere das tarefas tradicionais de classificação ou regressão porque envolve ambientes interativos e agentes que realizam ações para maximizar as recompensas. Em vez de rotular os dados de treinamento, recebemos sinais de recompensa com base em nossas ações no ambiente. Para demonstrar esse conceito, vejamos o exemplo DQN (Deep Q-Network) usando o ambiente Cartpole.

O ambiente Cartpole simula um poste equilibrado em um carrinho, e o objetivo é manter o poste na posição vertical pelo maior tempo possível. Recebemos uma recompensa quando a vara permanece equilibrada e uma penalidade quando ela cai. Este é um problema clássico de aprendizado por reforço. No código, usamos uma memória de replay para armazenar experiências passadas e aproveitá-las durante o treinamento. Isso ajuda a superar o problema de observações correlacionadas que podem interromper o processo de retropropagação. Nossa arquitetura de rede é definida de forma semelhante ao exemplo CIFAR-10, mas agora nos concentramos em prever recompensas futuras com base em um par estado-ação. Selecionamos ações com base nas recompensas estimadas e atualizamos nosso modelo de acordo.

Por fim, quero compartilhar meu próprio exemplo rápido no qual trabalhei ontem. Criei um ambiente simples onde um jogador navega em direção a uma recompensa. O jogador recebe uma recompensa com base na distância até o gol.

Neste exemplo, criei um ambiente baseado em grade onde um jogador navega em direção a uma recompensa. O objetivo do jogador é chegar à posição de meta e receber uma alta recompensa, evitando obstáculos e penalidades. A posição atual do jogador é representada pelas coordenadas (x, y) na grade.

Para implementar isso, usei um array 2D para representar o ambiente. Cada célula na matriz corresponde a uma posição na grade e contém um valor que indica o tipo dessa célula (por exemplo, obstáculo, recompensa, penalidade, espaço vazio). Inicialmente, o jogador é colocado aleatoriamente no ambiente e a posição do gol é definida para uma coordenada específica.

Em seguida, defini uma rede neural que toma a posição atual do jogador como entrada e prevê a melhor ação a ser tomada (ou seja, mover para cima, para baixo, para a esquerda ou para a direita) para atingir o objetivo. A rede é treinada usando uma variante do algoritmo Q-learning, onde os valores Q representam as recompensas esperadas para cada ação em um determinado estado.

Durante o treinamento, o jogador explora o ambiente realizando ações e recebendo recompensas imediatas com base em sua posição. Essas recompensas são usadas para atualizar os valores Q e melhorar as previsões da rede. O processo de treinamento continua até que o jogador atinja consistentemente a posição de meta e receba altas recompensas.

Após a conclusão do treinamento, podemos testar a rede treinada permitindo que o jogador navegue pelo ambiente usando a política aprendida. O jogador usa as previsões da rede para selecionar as melhores ações em cada etapa, aproximando-se gradativamente do objetivo.

Este exemplo demonstra a aplicação do aprendizado por reforço profundo em um ambiente personalizado. Ele mostra como uma rede neural pode aprender a navegar em um espaço complexo, tomar decisões com base em recompensas e penalidades e atingir um objetivo específico.

 

Aprendendo Representações Interpretáveis



Aprendendo Representações Interpretáveis

Olá, meu nome é Arun e, nesta apresentação, discutirei o tópico de aprendizado de representações interpretáveis em redes profundas. As redes neurais profundas provaram ser altamente bem-sucedidas em vários domínios, como visão computacional, robótica e processamento de linguagem natural. No entanto, uma de suas desvantagens é a falta de interpretabilidade. Ao contrário dos modelos mais simples, as redes profundas não são facilmente compreensíveis apenas examinando suas ativações. Isso representa um desafio quando queremos obter insights sobre o que a rede está realmente aprendendo.

Em muitos casos, as representações intermediárias em redes profundas não são significativas ou interpretáveis. Embora possamos visualizar os pesos das camadas convolucionais e obter algum entendimento após o treinamento, na maioria das vezes, essas redes são tratadas como aproximadores de caixa preta. Mas e se nos importarmos com a interpretabilidade?

Nesta apresentação, focarei na abordagem de estruturação de redes profundas para produzir representações interpretáveis. Ao incorporar o conhecimento prévio sobre o domínio do problema na estrutura da rede, podemos obter uma melhor interpretabilidade, o que geralmente leva a uma melhor generalização e eficiência dos dados.

Existem diferentes maneiras de estruturar redes profundas para melhorar a interpretabilidade. Vou discutir cinco ou seis artigos que exploraram essa ideia. A primeira abordagem envolve a introdução de operações específicas explicitamente na arquitetura da rede. Por exemplo, as redes neurais convolucionais (CNNs) foram bem-sucedidas na análise de imagens usando operações locais em patches de imagem. Ao incluir camadas convolucionais, podemos reduzir o espaço de parâmetros e obter representações significativas. No entanto, é importante observar que a rede ainda pode aprender recursos para os quais não foi explicitamente treinada.

Outra abordagem é incorporar transformações dos dados na estrutura da rede. Por exemplo, transformações de corpos rígidos podem ser usadas para corrigir e alinhar objetos em uma cena. Ao modelar explicitamente essas transformações, podemos melhorar a capacidade da rede de entender a estrutura subjacente dos dados. Além disso, integrar dinâmica e modelagem baseada em física em redes profundas também pode melhorar a interpretabilidade. Usando técnicas como renderização com OpenGL, podemos simular interações realistas e melhorar a compreensão da rede sobre o mundo físico.

Além disso, discutirei o trabalho de estruturação do processo de treinamento para encorajar representações mais interpretáveis. Isso envolve atribuir significado a representações intermediárias e treinar explicitamente a rede para prever atributos ou propriedades específicas dos dados. Ao incorporar tal estrutura no processo de treinamento, podemos orientar a rede para aprender representações mais significativas.

Para ilustrar esses conceitos, apresentarei alguns exemplos. Um artigo se concentra em redes de cápsulas, que visam codificar informações de alto nível sobre objetos em uma cena. Combinando as saídas de cápsulas que reconhecem objetos e predizem propriedades de objetos, podemos gerar resultados mais precisos e interpretáveis.

Outro artigo recente apresenta a arquitetura de rede transformadora espacial, que aprende a deformar os dados de entrada em uma representação canônica. Ao prever os parâmetros de transformação e aplicá-los à entrada, a rede corrige as variações e alinha os dados para facilitar o processamento e a classificação.

Por fim, discutirei meu próprio trabalho sobre modelagem de dinâmica de cena. Ao incorporar explicitamente a priori da física e modelar o movimento do corpo rígido usando rotações e translações, podemos melhorar a capacidade da rede de prever com precisão as interações do objeto.

Em conclusão, ao estruturar redes profundas para produzir representações interpretáveis, podemos obter informações valiosas sobre seu funcionamento e melhorar seu desempenho em várias tarefas. A inclusão de conhecimento prévio, o uso de operações específicas e a integração de dinâmicas e transformações são estratégias que podem melhorar a interpretabilidade e levar a uma melhor generalização e eficiência dos dados.

Learning Interpretable Representations
Learning Interpretable Representations
  • 2017.08.17
  • www.youtube.com
#hangoutsonair, Hangouts On Air, #hoa
 

Redes Neurais Recorrentes



Redes Neurais Recorrentes

O autor investiga o intrincado funcionamento das redes neurais recorrentes (RNNs) e das redes de memória de longo prazo (LSTM), lançando luz sobre seu significado e funcionalidade. As RNNs, ao contrário das redes neurais convencionais que podem ser representadas como grafos acíclicos direcionados, possuem ciclos em sua estrutura de grafos. Essa natureza cíclica exige considerar a sequência temporal das entradas ao processar os dados. O foco principal do autor reside em RNNs de séries temporais, que efetivamente lidam com entradas em várias etapas de tempo.

Para ilustrar esse conceito, o autor apresenta um exemplo cativante de problema denominado "Encontre Bilbo". Neste cenário, uma rede neural regular encontra dificuldade em localizar Bilbo na terceira e quarta imagens devido à oclusão parcial por uma árvore. No entanto, os humanos podem explorar informações temporais para deduzir que Bilbo provavelmente está posicionado atrás da árvore. As redes neurais recorrentes, com suas capacidades de memória inerentes, oferecem uma solução para esse problema. O autor passa a explicar como a rede neural recorrente pode ser desdobrada ao longo do tempo, permitindo que as informações sejam passadas de uma etapa de tempo para outra. Esse recurso permite que a rede retenha as informações de localização de Bilbo.

O treinamento de uma rede neural recorrente envolve a retropropagação de gradientes ao longo do tempo. No entanto, esse processo pode levar ao desafio de explodir ou desaparecer gradientes, principalmente quando a rede é desdobrada em várias etapas de tempo. Para resolver esse problema, o autor apresenta as redes LSTM. As redes LSTM são projetadas especificamente para mitigar o problema de explosão ou desaparecimento de gradientes. Eles empregam estruturas internas especializadas conhecidas como portões, que controlam efetivamente o fluxo de informações e atualizam a memória da rede. O autor explica ainda os quatro portões fundamentais de um LSTM: o portão de esquecimento, portão de entrada, entrada de bloco e portão de saída. Essas portas colaboram para esquecer e lembrar seletivamente informações dentro da memória da rede.

Além disso, o autor menciona várias variações comumente usadas de LSTMs. Isso inclui a incorporação de um estado recorrente explícito, que permite ao LSTM considerar o estado recorrente anterior como uma entrada, e a utilização de peepholes, que permitem que os portões considerem o estado atual da célula ao tomar decisões.

Mudando de marcha, o autor inicia uma explicação detalhada dos LSTMs, enfatizando especificamente sua utilidade na detecção e rastreamento de água. Embora uma rede recorrente possa não ser imperativa para a detecção de água, uma vez que a água é facilmente distinguível, o problema de rastreamento se beneficia muito da informação temporal oferecida por um LSTM. A natureza recorrente dos LSTMs permite a agregação e retenção de informações ao longo do tempo, o que se mostra inestimável para rastrear objetos como água com reflexões e refrações dinâmicas.

O autor passa a apresentar resultados de pesquisas que comparam o desempenho de diferentes redes no contexto de tarefas de detecção e rastreamento. Os resultados demonstram que uma rede neural convolucional regular (CNN) sem recorrência exibe menor precisão na detecção e rastreamento de água em comparação com uma rede LSTM recorrente. O autor também menciona outra rede que leva em conta vários quadros simultaneamente, mas carece de recorrência. Embora esta rede supere a CNN regular, ela ainda fica aquém da precisão alcançada pelo LSTM.

Expandindo o assunto, o autor oferece informações adicionais sobre a inicialização do estado da célula ou estado recorrente em um LSTM. Normalmente, esses estados são inicializados com zeros. No entanto, as opções alternativas incluem inicializá-los com o estado médio da célula dos dados de treinamento ou alavancar o conhecimento específico do domínio para fins de inicialização.

O texto posteriormente faz a transição para outro exemplo ilustrativo, investigando a obra de Daniel e sua criação, "re3". Este trabalho gira em torno do rastreamento de objetos em vídeos. O autor explica a arquitetura de rede empregada, apresentando duas camadas LSTM internas. Ao incorporar recortes de imagem ao redor do objeto nas etapas de tempo anterior e atual, a rede rastreia efetivamente o movimento do objeto ao longo do tempo. O autor destaca a notável capacidade do LSTM de lidar com mudanças de aparência, oclusões e variações de iluminação, tornando-o uma ferramenta potente para rastreamento de objetos.

Concluindo a discussão, o autor observa que o desempenho das redes baseadas em LSTM depende dos requisitos específicos da tarefa em questão. Embora essas redes sejam benéficas para problemas envolvendo objetos com aparências variadas, arquiteturas de rede mais simples podem ser suficientes para outros casos.

Em resumo, o texto fornece uma exploração abrangente de redes neurais recorrentes, particularmente redes LSTM. Ele elucida sua finalidade, mecanismos e vantagens, ao mesmo tempo em que esclarece suas aplicações na detecção e rastreamento de água, bem como em tarefas de rastreamento de objetos. Além disso, o autor enfatiza a conveniência de implementar LSTMs usando PyTorch, destacando sua simplicidade em comparação com outros frameworks.

Recurrent Neural Networks
Recurrent Neural Networks
  • 2017.08.17
  • www.youtube.com
#hangoutsonair, Hangouts On Air, #hoa
 

Aprendizado Profundo Distribuído



Aprendizado Profundo Distribuído

Hoje marca a apresentação final de nossa jornada juntos, e eu gostaria de mergulhar no fascinante mundo da aprendizagem profunda distribuída. Embora esse tópico tenha despertado minha curiosidade, devo confessar que não o explorei extensivamente até agora. No entanto, acredito que vale a pena discutir os trade-offs e as implicações práticas do aprendizado profundo distribuído, pois ele possui um imenso potencial para acelerar os processos de treinamento. Lembre-se de que, embora eu possua algum conhecimento de sistemas e tenha escrito uma quantidade significativa de código, não sou um especialista nesse domínio. Portanto, pode haver complexidades que não compreendo totalmente quando se trata de sistemas distribuídos do mundo real. Dito isso, vamos embarcar nessa exploração do aprendizado profundo distribuído.

Quando falamos de aprendizado profundo distribuído, nosso objetivo principal é aumentar a velocidade e a eficiência. No entanto, existem vários fatores relacionados, mas distintos, que consideramos ao otimizar para um treinamento mais rápido. Esses fatores incluem minimizar o tempo de treinamento, maximizar a taxa de transferência, maximizar a simultaneidade, minimizar as transferências de dados, maximizar os tamanhos dos lotes e minimizar a latência. Cada um desses aspectos contribui para alcançar modelos de aprendizado profundo mais rápidos e eficientes.

Minimizar o tempo de treinamento e maximizar o tamanho dos lotes são conceitos intimamente interligados. Aumentar o tamanho do lote permite maiores taxas de aprendizado, acelerando o treinamento. Para ilustrar esse ponto, vamos imaginar começar com uma única GPU e um tamanho de lote modesto de, digamos, 100 imagens. À medida que tentamos aumentar o tamanho do lote para, por exemplo, 200 imagens, encontramos limitações em termos de memória da GPU. A solução está em alavancar várias máquinas ou GPUs. Ao distribuir os parâmetros de rede por várias GPUs, cada uma processando um tamanho de lote de 100, podemos paralelizar as passagens para frente e para trás. Depois, sincronizamos os gradientes e atualizamos os modelos de acordo. Por exemplo, o Facebook desenvolveu um hardware personalizado capaz de acomodar 256 GPUs, permitindo que treinassem o ImageNet em um modelo ResNet-50 em apenas uma hora. Embora essa escalabilidade extrema possa não ser necessária para a maioria dos aplicativos, entender os princípios e compensações envolvidos pode ser benéfico para futuros empreendimentos ou estágios neste campo.

A seguir, vamos examinar passo a passo o conceito de otimização da eficiência. Discutiremos possíveis armadilhas e ofereceremos recomendações para alcançar a exatidão e a velocidade.

  1. Normalizando a função de perda: É crucial normalizar a função de perda em relação ao tamanho total do lote. Ao replicar uma rede em várias máquinas ou GPUs, a soma ou a média dos gradientes produz resultados diferentes. Ao garantir que a função de perda seja normalizada corretamente, mantemos a consistência em diferentes tamanhos de lote, facilitando o treinamento preciso e eficiente.

  2. Embaralhamento de dados: ao distribuir dados entre vários trabalhadores ou máquinas, o embaralhamento torna-se essencial. Sem embaralhamento, os mini-lotes podem ficar correlacionados por um período prolongado, reduzindo a eficácia do treinamento. Ao embaralhar os dados no início de cada época, garantimos a aleatoriedade e evitamos que padrões semelhantes influenciem mini-lotes consecutivos.

  3. Normalização em lote: a normalização em lote apresenta desafios únicos em um ambiente distribuído. Para enfrentar esses desafios, é recomendável executar estatísticas de normalização de lote em minilotes, geralmente limitadas ao tamanho do lote de uma GPU. Essa abordagem permite o paralelismo sem sacrificar os benefícios obtidos com a distribuição da carga de trabalho. Os pesquisadores exploraram essa questão extensivamente e recomendo consultar o trabalho deles para uma compreensão mais detalhada.

  4. Lidando com erros e monitorando o progresso: ao buscar o aprendizado profundo distribuído, é essencial ter mecanismos robustos de tratamento de erros e sistemas de monitoramento de progresso. Com o aumento da complexidade e escala dos sistemas distribuídos, erros e gargalos podem ocorrer. Ao implementar ferramentas confiáveis de tratamento e monitoramento de erros, podemos mitigar possíveis problemas e garantir uma operação tranquila.

  5. Considerações específicas do sistema: Cada sistema distribuído tem seu exclusivo.

Vamos continuar explorando considerações específicas do sistema em aprendizado profundo distribuído:

a. Sobrecarga de comunicação: a comunicação entre diferentes máquinas ou GPUs é um fator significativo no aprendizado profundo distribuído. O tempo necessário para transferências de dados e sincronização pode afetar a velocidade geral do treinamento. É crucial otimizar os padrões de comunicação e minimizar a movimentação desnecessária de dados. Técnicas como compressão de gradiente, quantização de gradiente e esparificação de gradiente podem ajudar a reduzir a sobrecarga de comunicação e melhorar a eficiência.

b. Arquitetura de rede: a escolha da arquitetura de rede também pode afetar o desempenho do deep learning distribuído. Algumas arquiteturas são inerentemente mais adequadas para treinamento distribuído, enquanto outras podem exigir modificações ou técnicas adicionais para obter uma paralelização eficiente. Entender as características da arquitetura escolhida e sua compatibilidade com o treinamento distribuído é importante para otimizar os resultados.

c. Particionamento de dados e balanceamento de carga: ao distribuir dados entre vários trabalhadores, é essencial particionar os dados de forma a equilibrar a carga de trabalho uniformemente. A distribuição desigual de dados pode levar a um desequilíbrio de carga e a um treinamento mais lento. Técnicas como paralelismo de dados, paralelismo de modelo e paralelismo híbrido podem ser usadas para distribuir a carga de trabalho de forma eficaz e obter balanceamento de carga.

d. Tolerância a Falhas: Sistemas distribuídos são propensos a falhas, e é crucial incorporar mecanismos de tolerância a falhas para garantir robustez. Técnicas como ponto de verificação e recuperação automática podem ajudar a lidar com falhas de forma harmoniosa e retomar o treinamento sem interrupções significativas.

e. Escalabilidade: À medida que o tamanho do sistema distribuído cresce, a escalabilidade se torna um fator crítico. O sistema deve ser capaz de lidar com um número crescente de máquinas ou GPUs de forma eficiente, sem degradação significativa do desempenho. Garantir a escalabilidade requer um projeto de sistema cuidadoso, alocação de recursos e otimizações de comunicação.

f. Sincronização e consistência: no aprendizado profundo distribuído, é essencial sincronizar os modelos e gradientes entre diferentes trabalhadores para manter a consistência. Técnicas como treinamento síncrono, treinamento assíncrono e atualizações atrasadas podem ser usadas para equilibrar velocidade de convergência e consistência. A escolha do método de sincronização depende dos requisitos específicos da tarefa de treinamento e da arquitetura do sistema.

g. Gerenciamento de recursos: o gerenciamento eficiente de recursos é crucial no aprendizado profundo distribuído para utilizar os recursos disponíveis de maneira eficaz. Isso inclui gerenciar a memória da GPU, otimizar a utilização da GPU e alocar recursos dinamicamente com base na carga de trabalho. Técnicas como paralelismo de modelo e acúmulo de gradiente podem ajudar a superar as limitações de memória da GPU e maximizar a utilização de recursos.

Em conclusão, o aprendizado profundo distribuído oferece oportunidades significativas para acelerar o treinamento e melhorar a eficiência. No entanto, também apresenta desafios que precisam ser enfrentados para alcançar os melhores resultados. Ao considerar fatores como tamanho do lote, normalização, embaralhamento, sobrecarga de comunicação, considerações específicas do sistema, tolerância a falhas, escalabilidade, sincronização e gerenciamento de recursos, podemos navegar pelas complexidades do aprendizado profundo distribuído e liberar todo o seu potencial.

Distributed Deep Learning
Distributed Deep Learning
  • 2017.08.17
  • www.youtube.com
#hangoutsonair, Hangouts On Air, #hoa
 

Introdução à Computação Cognitiva e Inteligência Artificial



Introdução à Computação Cognitiva e Inteligência Artificial

Eu sou o Dr. Soper e tenho o prazer de dar as boas-vindas ao primeiro vídeo desta série abrangente sobre computação cognitiva e inteligência artificial (IA). Esta série visa fornecer conhecimento e insights para indivíduos interessados em aprender mais sobre esses campos interessantes. Independentemente de você ter algum conhecimento prévio sobre IA ou sistemas de computação cognitiva, esta série abordará os fundamentos e construirá uma base sólida.

Embora muitos de nós tenhamos encontrado inteligência artificial em livros de ficção científica ou filmes de grande sucesso, esta série de vídeos se concentrará na realidade e não na ficção. Nossa jornada mergulhará na verdadeira natureza da computação cognitiva e da inteligência artificial. Exploraremos suas definições, diferentes tipos de sistemas disponíveis hoje, suas funcionalidades, aplicações no mundo real e os efeitos transformadores que terão em vários aspectos de nossas vidas.

Um aspecto fascinante desta série é que também aprenderemos a utilizar Python e Jupyter Notebooks para construir a IA e os sistemas cognitivos que discutimos. Esta experiência prática será, sem dúvida, uma das partes mais agradáveis da série, à medida que nos envolvemos na implementação prática.

Então, vamos embarcar em nossa aventura educacional!

Como esta lição inicial serve como uma introdução à inteligência artificial e à computação cognitiva, é crucial definir esses termos. A inteligência artificial, em termos simples, refere-se à inteligência exibida pelas máquinas. Abrange dispositivos artificiais que percebem seu ambiente, realizam ações ou tomam decisões para atingir seus objetivos. O que diferencia os sistemas de inteligência artificial é sua capacidade de aprender de forma independente, sem a necessidade de instruções explícitas. Em vez disso, eles podem determinar autonomamente a abordagem mais eficaz para resolver problemas ou executar tarefas.

Por outro lado, a computação cognitiva refere-se a sistemas de IA que realizam tarefas ou fornecem serviços tradicionalmente exclusivos da cognição humana. Embora todos os sistemas de computação cognitiva sejam considerados inteligência artificial, nem todos os sistemas de IA possuem recursos cognitivos. A computação cognitiva inclui uma ampla gama de aplicações, como detecção de anomalias, análise de sentimentos, tradução de linguagem, processamento de linguagem natural, reconhecimento e síntese de fala, reconhecimento de imagem e vídeo e muito mais.

Ao longo desta série, exploraremos e implementaremos quatro tipos distintos de modelos de inteligência artificial que servem como base para vários sistemas de computação cognitiva.

Primeiro, vamos nos aprofundar no Thompson Sampling, um modelo de IA relativamente simples que ajuda os sistemas a lidar com o dilema exploração-exploração. Esses sistemas podem aprender autonomamente a selecionar ações que maximizem suas recompensas esperadas.

Em seguida, mergulharemos no Q-learning, que se enquadra no aprendizado por reforço. Q-learning envolve um agente operando em um ambiente caracterizado por estados e ações possíveis. Esses sistemas podem identificar automaticamente uma política ideal que orienta a tomada de decisões em qualquer estado.

O terceiro modelo que abordaremos é o aprendizado profundo, que gira em torno de redes neurais artificiais. Essas redes, semelhantes ao cérebro humano, consistem em nós ou neurônios interconectados. Redes neurais profundas servem de base para vários sistemas cognitivos e de IA intrigantes, incluindo aqueles envolvidos em reconhecimento de fala, tradução automática, diagnóstico médico e muito mais. Eles até demonstraram capacidades em tarefas como jogar videogames, criar obras de arte e compor músicas.

Por fim, exploraremos redes neurais convolucionais profundas. Essas redes empregam uma operação matemática especializada conhecida como convolução, permitindo que se sobressaiam no processamento de informações visuais de imagens e vídeos.

Agora, como a IA e a computação cognitiva revolucionarão o mundo? As possibilidades são quase ilimitadas! Até 2030, espera-se que essas tecnologias contribuam com aproximadamente US$ 16 trilhões para a economia global. Os benefícios potenciais para empresas, governos e indivíduos são abundantes.

No setor de energia, a IA e a computação cognitiva otimizarão o consumo e a distribuição de energia, reduzindo efetivamente o uso global de energia. Na área da saúde, essas tecnologias ajudarão na criação de novos medicamentos e vacinas, no diagnóstico de doenças e na prestação de cuidados médicos personalizados. Em transporte e logística, os veículos autônomos movidos por IA reduzirão drasticamente os acidentes e o congestionamento do tráfego, ao mesmo tempo em que revolucionam as entregas de comércio eletrônico. A educação se beneficiará de experiências de treinamento personalizadas e otimizadas facilitadas por IA e computação cognitiva. A segurança e a proteção serão aprimoradas por meio da capacidade da IA de reduzir o crime, aumentar a segurança pública e combater fraudes e roubo de identidade. O setor de empregos utilizará IA para identificar as melhores correspondências entre candidatos e cargos, aumentando a satisfação no trabalho. Casas inteligentes e robôs domésticos automatizarão tarefas, monitorarão dispositivos e fornecerão assistentes robóticos ao vivo, promovendo uma vida independente para adultos mais velhos e pessoas com deficiência. A IA e a computação cognitiva também revolucionarão o entretenimento e a socialização, recomendando experiências e ajudando as pessoas a encontrar novos amigos e círculos sociais. As iniciativas ambientais se beneficiarão do processamento aprimorado de resíduos, reciclagem e redução da poluição possibilitada pela IA. Nos negócios, a IA automatizará processos, otimizará lucros, fomentará a inovação e aprimorará a tomada de decisões.

Esses exemplos apenas arranham a superfície, já que a IA e a computação cognitiva continuarão a revelar inúmeras outras aplicações transformadoras. Eles têm o potencial de aprimorar a tomada de decisões, aumentar a inteligência humana e liberar recursos cognitivos para outras tarefas. Em um futuro próximo, as máquinas cognitivas e a IA se integrarão perfeitamente às nossas vidas, tornando-se tão indispensáveis quanto os smartphones, a internet ou a eletricidade. Vamos nos perguntar como conseguimos sem eles.

Em nossa próxima lição, exploraremos os Jupyter Notebooks, uma ferramenta poderosa que será usada em conjunto com o Python ao longo desta série para criar e implementar os modelos de IA discutidos anteriormente. Mesmo que você não esteja familiarizado com Jupyter Notebooks ou Python, tenha certeza de que ganhará uma experiência significativa com essas ferramentas à medida que nossa jornada avança.

Espero que você tenha achado esta lição introdutória sobre computação cognitiva e inteligência artificial informativa e envolvente. Até a próxima, tenha um ótimo dia!

Introduction to Cognitive Computing & Artificial Intelligence
Introduction to Cognitive Computing & Artificial Intelligence
  • 2020.03.24
  • www.youtube.com
In this first video in the series, Dr. Soper introduces the concepts of artificial intelligence (AI) and cognitive computing. Topics discussed include the re...
 

Seu kit de ferramentas de IA - trabalhando com notebooks Jupyter



Seu kit de ferramentas de IA - trabalhando com notebooks Jupyter

Eu sou o Dr. Soper e hoje tenho o prazer de apresentar a você seu kit de ferramentas de inteligência artificial. Nosso foco principal será em uma tecnologia incrivelmente útil e amigável chamada Jupyter Notebooks.

Mas antes de mergulharmos nos detalhes, vamos analisar o que você pode esperar aprender nesta lição.

Ao final deste vídeo, você terá uma compreensão clara de:

  1. A importância de ter um kit de ferramentas de IA.
  2. A definição e a finalidade dos notebooks Jupyter.
  3. As vantagens de usar Jupyter Notebooks para projetos de IA e computação cognitiva.
  4. Como criar Jupyter Notebooks gratuitamente no Google Cloud e no Microsoft Cloud.
  5. Como utilizar efetivamente os Jupyter Notebooks para desenvolver e executar projetos de IA e computação cognitiva.

Ao longo desta lição, embarcaremos em uma jornada prática para construir, treinar e testar uma rede neural artificial. Você ficará agradavelmente surpreso com a simplicidade do processo!

Para começar, vamos discutir por que ter um kit de ferramentas de IA é essencial.

Esta série de vídeos sobre computação cognitiva e inteligência artificial vai além da teoria e dos conceitos. Você aprenderá como construir vários tipos de modelos de IA!

Para construir qualquer modelo de inteligência artificial ou computação cognitiva, precisamos de um conjunto de ferramentas. Essas ferramentas incluem recursos computacionais como CPUs, memória e armazenamento para nossos arquivos. Também exigimos um ambiente de desenvolvimento onde possamos trabalhar em nossos projetos de IA. Por fim, precisamos de um conjunto de instruções para comunicar nossas ações desejadas ao computador.

Em termos de ferramentas, aprenderemos a linguagem de programação Python ao longo desta série, a partir do próximo vídeo.

Com relação aos recursos computacionais e ao ambiente de desenvolvimento, os Jupyter Notebooks hospedados na nuvem podem fornecer tanto para nossos projetos de IA quanto de computação cognitiva.

Agora, vamos explorar o que são os Jupyter Notebooks.

Um Jupyter Notebook é um ambiente interativo baseado na Web que consiste em uma coleção ordenada de células. Cada célula em um Jupyter Notebook pode conter texto, código de programação, fórmulas matemáticas, imagens ou outros elementos de mídia.

Essa versatilidade permite que você mantenha todas as suas anotações, códigos, diagramas, visualizações e resultados de seus modelos de IA e computação cognitiva em um só lugar.

Os Jupyter Notebooks utilizam kernels para executar o código de programação e manter o estado atual do seu projeto. Um dos recursos mais impressionantes dos notebooks Jupyter é a capacidade de executar uma célula por vez. O servidor de notebook acompanha automaticamente o estado atual do projeto na memória.

Esse recurso permite escrever código em uma célula, executá-lo e observar os resultados. Você pode então escrever código adicional nas células subseqüentes, acessando e utilizando os resultados das células anteriores. Essa abordagem incremental permite que você crie e refine seu projeto gradualmente, sem a necessidade de reexecutar tudo sempre que fizer uma alteração.

Outro aspecto digno de nota dos Jupyter Notebooks é o suporte para várias linguagens de programação, como Julia, Python e R. O nome "Jupyter" na verdade se origina da combinação dessas três linguagens.

Agora, você pode se perguntar por que os Jupyter Notebooks são preferíveis a outras plataformas de desenvolvimento.

Embora abordagens alternativas estejam disponíveis, os Jupyter Notebooks oferecem inúmeras vantagens para projetos de IA e computação cognitiva:

  1. Os notebooks Jupyter são executados diretamente em um navegador da Web, eliminando a necessidade de instalar ou configurar software especializado. Desde que você tenha uma conexão com a Internet, você pode trabalhar em seus projetos de qualquer dispositivo e sistema operacional, independentemente de sua localização.
  2. Os notebooks Jupyter são totalmente gratuitos! Grandes empresas de tecnologia como Google e Microsoft fornecem generosamente Notebooks Jupyter em suas plataformas de nuvem sem nenhum custo. Isso permite que você trabalhe em modelos de IA e aprendizado de máquina de ponta sem investir em softwares caros.
  3. Os Jupyter Notebooks são fáceis de usar e aprender. A interface é simples e intuitiva, economizando tempo e esforço na configuração de ambientes de desenvolvimento complexos. Você pode se concentrar em escrever código e experimentar modelos de IA imediatamente.
  4. Os Jupyter Notebooks promovem a colaboração e o compartilhamento de conhecimento. Você pode compartilhar facilmente seus notebooks com colegas, colaboradores ou com a comunidade de IA mais ampla. Isso facilita o desenvolvimento colaborativo e incentiva a troca de ideias e melhores práticas.
  5. Os Jupyter Notebooks oferecem suporte à integração de mídia avançada. Você pode incluir imagens, vídeos, visualizações interativas e texto explicativo junto com seu código. Isso facilita a comunicação e a documentação de seus modelos de IA, melhorando a compreensão geral e a reprodutibilidade do seu trabalho.
  6. Os Jupyter Notebooks permitem a exploração e visualização interativa de dados. Com bibliotecas integradas como Matplotlib e Seaborn, você pode gerar visualizações perspicazes diretamente em seu notebook. Isso permite que você obtenha uma compreensão mais profunda de seus dados e tome decisões mais informadas durante o processo de desenvolvimento do modelo.
  7. Os Jupyter Notebooks fornecem acesso a um vasto ecossistema de bibliotecas Python para IA e aprendizado de máquina. O Python tornou-se a linguagem de escolha para muitos profissionais de IA devido à sua simplicidade e amplo suporte a bibliotecas. Com Jupyter Notebooks, você pode facilmente importar e utilizar bibliotecas como TensorFlow, PyTorch, scikit-learn e muito mais.
  8. Os Jupyter Notebooks oferecem excelentes recursos de documentação. Você pode incluir explicações, instruções e comentários detalhados nas células do bloco de anotações. Isso ajuda você a acompanhar seu processo de pensamento, compartilhar ideias com outras pessoas e revisitar e revisar seu trabalho posteriormente.

Agora que entendemos os benefícios de usar Jupyter Notebooks, vamos discutir como criá-los gratuitamente no Google Cloud e no Microsoft Cloud.

Tanto o Google Cloud quanto o Microsoft Cloud oferecem serviços Jupyter Notebook como parte de suas plataformas de nuvem. Esses serviços fornecem um ambiente pré-configurado para criar e executar Jupyter Notebooks.

No Google Cloud, você pode usar o Google Colab (abreviação de Colaboratory), que é um ambiente Jupyter Notebook gratuito que roda na infraestrutura do Google. Ele fornece acesso a GPUs e TPUs para cálculos de aprendizado de máquina acelerados.

Para criar um Jupyter Notebook no Google Colab, basta acessar o site do Google Colab (colab.research.google.com), fazer login com sua conta do Google e iniciar um novo notebook. Você pode optar por criar um bloco de anotações em branco ou abrir um bloco de anotações existente no Google Drive ou no GitHub.

Da mesma forma, no Microsoft Cloud, você pode usar o Azure Notebooks, que é um serviço Jupyter Notebook gratuito fornecido pela Microsoft. Os notebooks do Azure oferecem um ambiente colaborativo para projetos de ciência de dados e aprendizado de máquina.

Para criar um Jupyter Notebook em Azure Notebooks, você pode entrar no site Azure Notebooks (notebooks.azure.com) com sua conta da Microsoft. A partir daí, você pode criar um novo projeto, que incluirá um Jupyter Notebook por padrão.

Tanto o Google Colab quanto o Azure Notebooks fornecem uma interface Jupyter Notebook familiar com os recursos computacionais necessários para executar seus modelos de IA. Você pode instalar bibliotecas adicionais, carregar conjuntos de dados e colaborar com outras pessoas sem problemas.

Na próxima parte desta lição, mergulharemos em um exemplo prático e demonstraremos como utilizar efetivamente os Jupyter Notebooks para desenvolver e executar projetos de IA e computação cognitiva.

Fique ligado e vamos continuar nossa jornada no mundo da IA e dos notebooks Jupyter!

Your AI Toolkit - Working with Jupyter Notebooks
Your AI Toolkit - Working with Jupyter Notebooks
  • 2020.03.27
  • www.youtube.com
Dr. Soper introduces Jupyter Notebooks, and discusses why they provide a useful foundation for creating and working on artificial intelligence and cognitive ...
 

Fundamentos do Python - Parte 01


Fundamentos do Python - Parte 01

Eu sou o Dr. Soper e hoje tenho o prazer de apresentar a primeira de três lições abrangentes sobre os fundamentos da linguagem de programação Python. Embora seja impossível cobrir todos os detalhes da programação Python em alguns vídeos, ao final dessas três lições, você terá adquirido conhecimento suficiente para entender e embarcar em sua jornada de programação Python.

Ao longo dessas lições, usaremos Jupyter Notebooks, uma ferramenta poderosa para programação interativa e exploração de dados. Se você não estiver familiarizado com os Jupyter Notebooks, recomendo assistir ao vídeo anterior desta série para se familiarizar com este ambiente antes de mergulhar na programação Python.

Vamos começar fornecendo uma visão geral do que você aprenderá nesta lição. Ao final deste vídeo, você terá adquirido conhecimento sobre os seguintes aspectos do Python:

  1. Exibição de texto: aprenderemos como usar a função print() para mostrar o texto na tela. O texto em Python é colocado entre aspas simples para diferenciá-lo dos comandos de programação.

  2. Variáveis: Variáveis são locais de armazenamento nomeados simbolicamente na memória de um computador. Eles contêm valores que podem ser alterados conforme necessário. Exploraremos como criar variáveis e atribuir valores a elas, sejam elas texto, números inteiros ou flutuantes.

  3. Operadores aritméticos: Python oferece vários operadores aritméticos para executar operações matemáticas em variáveis. Abordaremos operações de adição, subtração, multiplicação, divisão, exponenciação e módulo.

  4. Operadores de comparação: Os operadores de comparação nos permitem comparar dois valores e determinar sua relação. Aprenderemos sobre operadores como "igual a", "diferente de", "maior que", "menor que", "maior ou igual a" e "menor ou igual a".

Ao longo da lição, utilizaremos exemplos e demonstrações para solidificar sua compreensão dessas habilidades e recursos do Python. Vamos começar discutindo como exibir texto em Python. Para exibir uma linha de texto, usamos a função print(). O texto que queremos exibir é passado como um argumento para a função print() entre aspas simples. Além disso, podemos incluir quebras de linha usando o símbolo "\n". Os comentários, indicados pelo sinal de libra (#), são apenas para uso humano e ajudam a explicar as seções de código. Python ignora comentários ao executar o código.

Para demonstrar essas técnicas, vamos considerar uma célula de código em um Jupyter Notebook. A célula de código usa a função print() para exibir o texto "Olá, meu nome é Dan!" na tela. Outro exemplo mostra o uso de "\n" para exibir várias linhas de texto em uma única chamada de função print().

Passando para as variáveis, elas são nomeadas locais de armazenamento na memória de um computador. As variáveis podem conter dados de qualquer tipo. Para criar uma nova variável em Python, atribuímos um valor a ela digitando seu nome no lado esquerdo do sinal de igual e o valor no lado direito. Em uma célula de código, podemos declarar variáveis como "product_name" com o valor 'Delicious Nachos', "quantity_sold" com o valor 33 e "unit_price" com o valor 12,99. Podemos então imprimir os valores dessas variáveis usando a função print() e a concatenação.

Como alternativa, podemos usar a função format() para obter o mesmo resultado com espaços reservados para valores de variáveis. Isso simplifica o processo, permitindo-nos definir o texto de saída desejado e indicar as posições variáveis entre chaves. Para demonstrar operadores aritméticos, utilizamos símbolos como "+" para adição, "-" para subtração, "*" para multiplicação, "/" para divisão, "**" para exponenciação e "%" para operação de módulo. Esses operadores realizam cálculos matemáticos em variáveis.

Espero que todos tenham um dia maravilhoso. Meu nome é Dr. Soper e hoje tenho o prazer de apresentar a primeira parte de uma série de três lições sobre os fundamentos da linguagem de programação Python. Agora, é importante observar que não poderei cobrir todos os detalhes da programação Python em apenas alguns vídeos. No entanto, ao concluir essas três lições, você terá adquirido conhecimento suficiente para entender e começar a trabalhar com projetos Python.

Ao longo dessas lições, usarei um Jupyter Notebook para realizar todos os exemplos. Se você não estiver familiarizado com os Jupyter Notebooks, recomendo assistir ao vídeo anterior desta série antes de mergulhar no mundo da programação Python. Sem mais delongas, vamos dar uma breve visão geral do que você aprenderá nesta lição.

Ao final deste vídeo, você terá um bom entendimento dos seguintes aspectos do Python:

  1. Exibindo texto
  2. Variáveis
  3. Operadores aritméticos
  4. Operadores de comparação

Exploraremos cada um desses tópicos em detalhes, com muitos exemplos ilustrativos e demonstrações para ajudá-lo a compreender os conceitos e recursos da linguagem de programação Python. Vamos começar aprendendo como exibir texto em Python. Para exibir uma linha de texto em Python, usamos a função print(). O texto que queremos exibir é passado como um argumento para a função print(), entre aspas simples. Em Python, é comum colocar strings literais de texto entre aspas simples. Isso ajuda o Python a distinguir entre strings de texto e outros comandos de programação baseados em texto.

No exemplo abaixo, você notará uma linha precedendo a função print() que começa com um sinal de cerquilha (#). Esta linha é chamada de comentário. Comentários são destinados apenas para uso humano. Eles nos ajudam a entender o propósito de uma determinada seção do código e facilitam a compreensão do nosso código por outras pessoas. Python ignora comentários, considerando-os como instruções não executáveis. Portanto, eles não afetam a funcionalidade do código. Se você quiser incluir uma quebra de linha em sua saída de texto, você pode usar a sequência de escape \n (nova linha). Isso inserirá uma quebra de linha nesse ponto.

Agora, vamos ver uma demonstração dessas técnicas. Na primeira célula de código deste notebook, temos um exemplo simples que utiliza a função print() para exibir uma linha de texto na tela. Ao clicar no botão executar, o texto "Olá, meu nome é Dan!" será exibido. Na próxima célula de código, usaremos o símbolo de nova linha \n para exibir várias linhas de texto com apenas uma chamada para a função print(). Ao executar o código, o Python imprimirá as duas linhas de texto na tela. Agora que abordamos a exibição de texto, vamos passar para as variáveis em Python.

Uma variável é um local de armazenamento nomeado simbolicamente na memória de um computador. Cada variável tem um nome e um valor, que podem ser alterados conforme necessário. As variáveis são incrivelmente úteis para manter o controle dos dados em um programa. Por exemplo, você pode usar uma variável para armazenar o número de ingressos vendidos para um show. Sempre que um ingresso adicional é vendido, você pode atualizar o valor da variável para refletir a contagem correta.

Em Python, as variáveis podem conter dados de qualquer tipo, como texto, inteiros ou floats (números com decimais). Para criar uma nova variável, basta atribuir um nome e um valor a ela. Vamos dar uma olhada em alguns exemplos para entender melhor o conceito. No primeiro exemplo, declaramos uma variável chamada "x" e atribuímos a ela um valor de 33. No segundo exemplo, declaramos uma variável chamada "current_price" e atribuímos a ela um valor de 42,99.

Observe que os valores atribuídos às variáveis podem ser números, texto ou qualquer outro tipo de dados válido. Depois de atribuir valores às variáveis, podemos usar a função print() para exibir seus valores na tela. No terceiro exemplo, usamos a função print() para exibir o valor da variável "x". Fazemos o mesmo para a variável "current_price" no quarto exemplo.

Você pode ver que, ao imprimir as variáveis, podemos visualizar seus valores e trabalhar com eles conforme necessário. Além de imprimir variáveis diretamente, há outra maneira de incorporá-las à saída de texto. Podemos usar a função format(), que simplifica o processo de combinação de texto e valores de variáveis. Nesse caso, você define o texto de saída desejado e indica as posições das variáveis usando chaves {} como espaços reservados. Dentro da função format(), você fornece as variáveis na ordem desejada.

Vamos dar uma olhada em um exemplo para ver isso em ação.

No quinto exemplo, temos uma variável chamada "product_name" com o valor "Delicious Nachos". Queremos exibir uma mensagem que inclua o nome do produto. Definimos o texto "I love {}!" como nossa saída desejada, com {} como um espaço reservado para o valor da variável. Dentro da função format(), fornecemos a variável "product_name". Ao executar o código, o Python substitui o espaço reservado pelo valor da variável e imprime o resultado, que é "I love Delicious Nachos!". Esse método permite mais flexibilidade e saída de texto dinâmico, especialmente ao trabalhar com várias variáveis ou mensagens mais complexas. Agora que abordamos as variáveis, vamos passar para os operadores aritméticos em Python.

Python fornece vários operadores aritméticos que nos permitem realizar operações matemáticas em variáveis.

Os operadores aritméticos mais usados são:

  • Adição: +
  • Subtração: -
  • Multiplicação: *
  • Divisão: /
  • Exponenciação: **
  • Módulo: %

Esses operadores podem ser usados com variáveis numéricas para realizar cálculos.

No exemplo a seguir, usaremos duas variáveis, "a" e "b", para demonstrar alguns desses operadores aritméticos.

Primeiro, declaramos uma variável chamada "a" e atribuímos a ela o valor 5. Em seguida, declaramos outra variável chamada "b" e atribuímos a ela a expressão "a + 2". A expressão "a + 2" adiciona o valor de "a" (que é 5) a 2, resultando no valor de "b" sendo 7. Podemos então usar a função print() para exibir os valores de "a" e "b" na tela.

Ao executar o código, o Python avaliará a expressão e exibirá os valores de "a" e "b", que são 5 e 7, respectivamente.

Além da adição, podemos usar o operador de subtração (-) para subtrair valores, o operador de multiplicação (*) para multiplicar valores, o operador de divisão (/) para dividir valores, o operador de exponenciação (**) para elevar valores a um potência e o operador de módulo (%) para calcular o restante de uma operação de divisão. Esses operadores aritméticos podem ser combinados e usados de várias maneiras para realizar cálculos complexos.

Por fim, vamos discutir brevemente os operadores de comparação em Python. Os operadores de comparação nos permitem comparar dois valores e determinar sua relação.

Os operadores de comparação mais usados são:

  • Igual a: ==
  • Diferente de: !=
  • Maior que: >
  • Menos de: <
  • Maior ou igual a: >=
  • Menor ou igual a: <=

Quando usados, esses operadores retornam um valor booleano de True ou False, indicando o resultado da comparação.

Por exemplo, a expressão a == b retorna True se o valor de "a" for igual ao valor de "b" e False caso contrário. No exemplo a seguir, compararemos os valores de duas variáveis, "a" e "b", usando diferentes operadores de comparação. Usaremos a função print() para exibir os resultados dessas comparações na tela. Ao executar o código, o Python avaliará cada expressão de comparação e exibirá o valor booleano correspondente. Você pode ver que a saída mostra o resultado de cada comparação: Verdadeiro ou Falso.

Os operadores de comparação são úteis para executar condicionalmente diferentes partes do seu código com base no relacionamento entre as variáveis.

Isso conclui nossa primeira lição sobre os fundamentos da programação Python. Nesta lição, abordamos:

  • Exibindo texto usando a função print()
  • Declarando e usando variáveis
  • Fazendo cálculos matemáticos com operadores aritméticos
  • Comparando valores usando operadores de comparação

Espero que esta lição tenha fornecido a você uma base sólida em programação Python. Na próxima lição, vamos nos aprofundar nos tipos de dados, incluindo strings, inteiros e floats.

Se você tiver alguma dúvida ou precisar de mais esclarecimentos sobre qualquer um dos tópicos abordados, sinta-se à vontade para perguntar. Obrigado por assistir, e vejo você na próxima lição!

Python Fundamentals - Part 01
Python Fundamentals - Part 01
  • 2020.04.02
  • www.youtube.com
Dr. Soper discusses several fundamentals of the Python programming language, including how to display text, how to declare and use variables, all of Python's...
Razão: