Uma rede neural profunda é caracterizada apenas pela presença de diversas camadas escondidas entre as camadas de entrada e saída.
Em uma rede convolucional a informação passa por filtros, com a intenção de acentuar e extrair características.
Deep learning faz extração automática de característica, enquanto que antigamente eram utilizadas técnicas de visão computacional.
O leave-one-out é uma instância específica da validação cruzada, onde o número de partições é igual ao número de exemplos.
4. O que reflete melhor o desempenho do algoritmo em produção o erro no conjunto de validação ou no conjunto de teste?
O erro no conjunto de teste. Durante o treinamento, o conjunto de validação é utilizado repetidas vezes para medir o erro do algoritmo. Já o conjunto de teste nunca foi visto pelo algoritmo, ou seja, os dados são novos, o que o torna mais próximo dos exemplos que serão utilizados em produção (ou o torna mais afastado dos exemplos já utilizados para treinamento / validação)
Quando informação da classe é utilizada no pré processamento, tem que fazer a separação antes, e fazer o pré processamento apenas no conjunto de treino.
O conjunto de validação é utilizado várias vezes pelo modelo para medir o erro. Dessa forma, o modelo tenta ser o mais certeiro possível apenas com relação ao conjunto de validação. Isso se assemelha a "ver a resposta" antes de "responder a uma pergunta".
O ideal, é utilizar um outro conjunto disjunto do treino, e da validação, de forma que esses dados nunca tenham sido utilizados pelo modelo, seja para treinamento, seja para validação.
O resultado de validação costuma ser superestimado, o que pode levar a conclusões erradas, visto que o fine-tunning é realizado utilizando o conjunto de validação.
A validação cruzada interna é utilizada principalmente para ajuste de hiper parâmetros (learning rate, beta, alpha, entre outros).
Para executar a validação cruzada, são necessários 2 loops:
- O externo, para verificar a qualidade do modelo.
- O interno, para realizar a seleção de parâmetros, e do modelo.
A Cada iteração do loop externo, o melhor modelo encontrado pelo loop interno será testado utilizando o conjunto de teste da partição externa (ou seja, este conjunto não foi visto pelo modelo). Ao final, haverão k estimativas (onde k é o numero de partições), e basta utilizar alguma métrica como a média para verificar qual modelo possui melhor desempenho.
O bias correction faz com que valores iniciais da série tenham mais importância que os próximos.
- Momentum: suaviza o gradiente utilizando média móvel exponencial.
- RMSProp: combinação entre o AdaGrad e Momentum, aplicando Momentum no AdaGrad.
- Adam: combinação entre RMSProp e Momentum, aplicando Momentum na loss.
Fórmula:
É um mecanismo para combater o modelo de aumentar sua complexidade. É adicionado um parâmetro na loss, chamado de parâmetro de regularização, sendo este proporcional ao tamanho / complexidade do modelo. Além disso, acompanha um hiper parâmetro
fonte. Voltar um pouco no vídeo.
A função satura muito rapidamente, ou seja, possui resultados muito próximos mesmo quando as entradas possuem valores distantes. Outro problema é a propagação de desativação de camadas, visto que seu intervalo varia entre
12. Explique porque não é necessário aplicar softmax na última camada da rede antes de calcular cross-entropy
Pois a cross-entropy já aplica softmax internamente.
A última camada deve conter 3 neurônios, visto que existem 3 saídas (positivo, neutro, e negativo).
13.2 Conside um exemplo da classe positiva, e uma que rede produz como saída os valores [0.5, 0, 1]
Qual é o valor da cross-entropy este caso
A cross
Assumindo que a saída segue o formato [positivo, neutro, negativo]
, temos:
Onde positivo
.
14. Mostre as equações utilizadas no Batch Norm e descreve como elas são utilizadas em uma rede neural
Calcula a média e desvio padrão de um batch, e utiliza o score-z.
gamma = desvio padrão do batch
beta = média do batch
16. Explique como uma skip connection presente nas ResNets podem fazer a rede ignorar algumas camadas da rede neural
Somando o valor de entrada inicial (identidade) com a saída da convolução.
17. A skip connection faz a soma da identidade com o fluxo da rede em diferentes pontos da rede. O que fazer com a identidade quanto o seu tamanho é incompatível com a região de junção na rede
Downsample, ou seja, faz uma convolução para que o valor de entrada (identidade) seja compatível com a saída, modificando a dimensão da identidade.
18. Faça CONV1x1 com 32 filtros (bottle neck) antes CONV5x5 de 64 e compare o número de parâmetros com e sem bottle neck (veja o vídeo da aula)
Ao fazer uma CONV5x5 diretamente com uma entrada que possui 256 canais, a convolução é aplicada em todos os 256 canais.
Ao aplicar uma CONV1x1 de 32 filtros antes da CONV5x5, a CONV5x5 será aplicada apenas em 32 canais.
Com isso, o número de parâmetros da rede diminui drasticamente. Além disso, uma vantagem de utilizar bottleneck, é que dessa forma a rede tenta generalizar a informação, resumindo-a em menos canais (filtros).
A entrada é separada por canal. Cada canal da conv é aplicado separadamente em cada canal da entrada. Depois de aplicada em cada canal, os canais são juntados, e então é aplicada uma conv1x1. Como a junção dos canais é feita em um passo separado, adicionar novos filtros à convolução não aumenta muito a quantidade de parâmetros, visto que basta adicionar uma nova conv1x1.
Consiste em ponderar os canais, ou seja, dar mais importância a alguns canais em relação a outros.
image = [
[1, 2],
[3, 4]
]
kernel = [
[3, 4],
[5, 6]
]
Produto de image[0, 0]
com o kernel:
saida00 = [
[1*3, 1*4, 0],
[1*5, 1*6, 0],
[0, 0, 0]
]
Produto de image[0, 1]
com o kernel:
saida01 = [
[0, 2*3, 2*4],
[0, 2*5, 2*6],
[0, 0, 0]
]
Produto de image[1, 0]
com o kernel:
saida10 = [
[0, 0, 0],
[3*3, 3*4, 0],
[3*5, 3*6, 0]
]
Produto de image[1, 1]
com o kernel:
saida11 = [
[0, 0, 0],
[0, 4*3, 4*4],
[0, 4*5, 4*6]
]
Somando as saídas, temos:
saida = [
[3, 10, 8],
[14, 40, 28],
[15, 38, 24]
]
23. Considerando o BPE e a lista de merges abaixo, faça a tokenização das palavras "inteligencia" e "computação"
merges = {
('c', 'i'): 'ci',
('ci', 'a'): 'cia',
('c', 'o'): 'co',
('co', 'm'): 'com',
('com', 'p'): 'comp',
('comp', 'u'): 'compu'
}
Tokenização da palavra inteligencia
:
t1 = [i, n, t, e, l, i, g, e, n, ci, a]
token_final = [i, n, t, e, l, i, g, e, n, cia]
Tokenização da palavra computação
:
t1 = [co, m, p, u, t, a, c, a, o]
t2 = [com, p, u, t, a, c, a, o]
t3 = [comp, u, t, a, c, a, o]
token_final = [compu, t, a, c, a, o]
24. Considerando o WordPiece e o vocabulário abaixo, faça a tokenização das palavras "facom" e "computacao"
vocabulario = [
"computa"
"fa"
"##c"
"##a"
"##o"
"##m"
]
Tokenização da palavra facom
# `facom` não existe no vocabulário, agora vamos buscar por `faco ##m`
# `faco ##m` não existe no vocabulário, agora vamos buscar por `fac ##o ##m`
# `fac ##o ##m` não existe no vocabulário, agora vamos buscar por `fa ##c ##o ##m`
# `fa ##c ##o ##m` existe no vocabulário, portanto, nosso token é o seguinte
t1 = ['fa', '##c', '##o', '##m']
Tokenização da palavra computacao
# `computacao` não existe no vocabulário, agora vamos buscar por `computaca ##o`
# `computaca ##o` não existe no vocabulário, agora vamos buscar por `computac ##a ##o`
# `computac ##a ##o` não existe no vocabulário, agora vamos buscar por `computa ##c ##a ##o`
# `computa ##c ##a ##o` existe no vocabulário, portanto, nosso token é o seguinte
t1 = ['computa', '##c', '##a', '##o']
# caso o token `##a` não existisse no vocabulário, teriamos o seguinte token
t1 = ['computa', '##c', '[UNK]', '##o']
Dúvida
: por que o faz não foi tokenizado da seguinte forma:
[fa, [UNK]]
, visto que o token fa
existe no vocabulário?
Serão tokenizadas caractere por caractere.
Serão tokenizadas como uma palavra inteira, ao invés de como partes da palavra.
27. Contexto similar ou significado similar: qual dessas similaridades melhor representa word embeddings produzidos pelo CBOW?
Contexto similar.