-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIA.txt
More file actions
385 lines (213 loc) · 11.7 KB
/
Copy pathIA.txt
File metadata and controls
385 lines (213 loc) · 11.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
Analogia simples:
Imagine que um modelo é um aluno:
Parâmetros = tamanho do cérebro (capacidade)
Tokens de treino = horas de estudo (experiência)
Um aluno com cérebro médio (2B) que estudou 4 trilhões de páginas pode ir tão bem ou melhor que um aluno mais inteligente (7B) que só estudou 1 trilhão.
"4 trilhões de tokens de treinamento" significa que o modelo foi treinado com uma quantidade massiva de texto, o que melhora sua qualidade, reduz alucinação e aumenta sua capacidade de gerar respostas úteis — mesmo com poucos parâmetros.
O que são “parâmetros”?
Parâmetros são como os “neurônios” do modelo — cada um aprende uma parte da linguagem ou conhecimento. Quanto mais parâmetros, maior a capacidade de memorizar, generalizar e raciocinar.
🔹 1B (1 bilhão): Pode entender linguagem simples, comandos, gerar texto básico.
🔹 7B (7 bilhões): Consegue manter contexto por mais tempo, raciocinar, responder perguntas técnicas com mais precisão.
O que são tokens?
Em modelos de linguagem, tokens são pequenas unidades de texto em que o conteúdo é dividido antes de ser processado. Podem ser:
Palavras inteiras: "cachorro", "Brasil"
Partes de palavras: "in-", "crível"
Pontuação: ".", ","
Espaços e símbolos
Exemplo:
A frase "O Brasil é incrível!" pode virar 5 a 7 tokens, dependendo do tokenizador.
Cada token é convertido em um número inteiro por meio de um vocabulário (ex.: “gosto” → 1578).
🔹 Por que é importante:
Modelos não entendem palavras diretamente; eles entendem números.
A tokenização é o primeiro passo para converter linguagem natural em dados processáveis.
Embeddings:
Um embedding é uma representação vetorial (lista de números) que captura o significado de um token, frase ou documento.
Exemplo:
“rei” → [0.12, -0.53, 0.88, ...]
“rainha” → [0.14, -0.51, 0.90, ...]
A distância entre os vetores é pequena, pois os significados são próximos.
🔹 Aplicações:
Busca semântica (RAG)
Agrupamento de textos
Similaridade textual
Redes Neurais Artificiais (RNA):
São estruturas matemáticas inspiradas no cérebro humano, compostas por camadas de neurônios artificiais.
Cada neurônio recebe entradas, faz uma transformação (pesos + função de ativação) e passa o resultado adiante.
O aprendizado acontece ajustando os pesos para minimizar erros.
🔹 Tipos básicos:
Feedforward: dados fluem numa direção (entrada → saída).
Convolucionais (CNNs): ótimas para imagens.
Recorrentes (RNNs): boas para sequências, como texto.
Redes Neurais Recorrentes (RNNs):
As RNNs são especializadas em processar dados sequenciais (como frases, séries temporais, áudio).
A saída de um passo é usada como entrada no passo seguinte → o modelo “lembra” do contexto anterior.
Problemas: dificuldade em lidar com dependências longas (gradiente desaparece).
🔹 Evoluções:
LSTM (Long Short-Term Memory)
GRU (Gated Recurrent Unit)
Essas versões melhoram a memória, mas ainda são limitadas em textos longos.
Transformers:
Os Transformers (introduzidos em 2017 pelo paper “Attention is All You Need”) substituíram as RNNs no processamento de linguagem natural.
🔹 Principais conceitos:
Self-Attention: o modelo aprende a “prestar atenção” em partes relevantes do texto, independentemente da posição.
Camadas empilhadas: combinam várias atenções e normalizações.
Paralelização: permite treinar modelos gigantes muito mais rápido que RNNs.
🔹 Submodelos:
Encoder (ex.: BERT) → compreensão
Decoder (ex.: GPT) → geração
Encoder-Decoder (ex.: T5) → tradução, resumo etc.
Treinamento de LLMs (Large Language Models):
Um LLM (como GPT, Llama, Mistral, Gemini etc.) é treinado em grandes volumes de texto (livros, sites, artigos).
🔹 Fases principais:
Pré-treinamento:
Aprende padrões gerais da linguagem, prevendo o próximo token.
Exemplo de tarefa: “O gato está em cima do ___” → “telhado”.
Fine-tuning supervisionado:
Ajuste com dados humanos (respostas de qualidade).
RLHF (Reinforcement Learning from Human Feedback):
Humanos avaliam respostas → o modelo aprende preferências humanas.
Fine-Tuning:
O Fine-Tuning é o processo de re-treinar um modelo já pronto com um conjunto de dados específico.
Pode ser completo (reajustando todos os pesos) ou parcial (usando técnicas como LoRA ou adapters).
Útil para personalizar o comportamento ou vocabulário do modelo.
RAG (Retrieval-Augmented Generation):
O RAG combina busca externa + geração de texto.
🔹 Processo:
O usuário faz uma pergunta.
O sistema busca documentos relevantes (usando embeddings).
O modelo lê esses trechos e gera uma resposta com base neles.
✅ Vantagens:
Mantém o modelo atualizado sem precisar re-treiná-lo.
Evita alucinações (pois a resposta é baseada em fontes reais).
Function Calling:
Function Calling é um recurso moderno em LLMs que permite que o modelo chame funções ou APIs externas com base em sua resposta.
Exemplo:
Usuário: “Qual a temperatura em Lisboa agora?”
Modelo: → chama a função get_weather("Lisboa").
🔹 Serve para:
Acessar dados dinâmicos (clima, finanças, etc.)
Integrar com sistemas (banco de dados, automações)
Criar agentes inteligentes (assistentes que agem, não só respondem)
O que é quantização?
Quantização, no contexto de inteligência artificial e redes neurais, é um processo de reduzir a precisão dos números usados para representar os parâmetros (pesos) e cálculos do modelo.
🧠 Explicando passo a passo
Como um modelo guarda conhecimento
Um LLM (como Mistral, LLaMA ou BitNet) aprende padrões da linguagem armazenando bilhões de valores numéricos chamados pesos.
Esses pesos normalmente são números de ponto flutuante (ex.: 0.123456...) armazenados com 16 ou 32 bits.
O que é quantizar
Quantizar significa representar esses valores com menos bits, reduzindo a precisão.
Por exemplo:
Sem quantização: 0.123456 (16 bits)
Com quantização em 4 bits: pode virar algo como 0.125
Com quantização extrema (BitNet): pode virar −1, 0 ou +1 (1,58 bits)
Por que fazer isso
Menos memória → arquivos menores e mais rápidos de carregar
Mais rápido para rodar → menos operações complexas
Menor consumo de energia → ideal para rodar em CPUs ou dispositivos móveis
O que se perde
Ao reduzir a precisão, o modelo pode perder fidelidade nos cálculos e gerar respostas ligeiramente menos precisas.
No entanto, técnicas como a do BitNet são treinadas desde o início já na forma quantizada, minimizando essa perda.
Aqui está a diferença prática usando um exemplo real de quantização nos pesos de um modelo:
Tipo de representação Bits Valores possíveis Exemplo de pesos
Original (FP32) 32 Valores reais muito precisos [0.9567, -0.7811, 0.8513, 0.5963, ...]
FP16 16 Alta precisão, mas menos que FP32 [0.9565, -0.7812, 0.8516, 0.5960, ...]
4 bits 4 Apenas 16 níveis possíveis [1.0, -0.7333, 0.8666, 0.6, ...]
BitNet (1 bit por valor) 1~2 Apenas -1, 0, +1 [1, -1, 1, 1, ...]
💡 Resumo:
Quantização = reduzir o número de bits usados para representar cada peso do modelo.
Isso reduz muito o tamanho do modelo e aumenta a velocidade, mas pode diminuir a precisão.
BitNet é um caso extremo: ele simplifica a matemática usando apenas três valores possíveis (-1, 0, 1), o que o torna muito rápido e leve.
O que são pesos em um modelo de IA?
Pesos são valores numéricos internos que um modelo de IA aprende durante o treinamento.
Eles determinam como o modelo transforma a entrada em uma saída.
Exemplo:
Saída = Entrada × Peso + Viés
O peso controla a influência da entrada sobre a saída.
Durante o treinamento, o modelo muda os pesos para gerar melhores respostas.
Quando falamos de quantização (como no BitNet), estamos dizendo:
"Vamos representar esses números (pesos) com menos bits — por exemplo, com 2 bits em vez de 32 — para economizar espaço e acelerar o modelo."
o que é o Viés?
O viés (bias) é um valor numérico adicional que é somado ao resultado da multiplicação entre a entrada e o peso, antes de passar para a próxima etapa da rede.
O viés é um valor adicional somado à multiplicação entre entrada e peso.
Ele permite que o modelo aprenda melhor, mesmo em situações onde a entrada por si só não ativa um neurônio.
É como o “ajuste fino” dos cálculos internos.
------------------
Vamos construir um exemplo bem simples de uma rede neural artificial do zero em Python, sem bibliotecas avançadas como PyTorch ou TensorFlow — apenas com NumPy.
Objetivo:
Vamos criar um modelo que aprende a somar dois números.
O que vamos usar:
Entradas (inputs): dois números, por exemplo [2, 3]
Saída esperada (target): 5 (porque 2 + 3 = 5)
A rede terá:
1 camada oculta
pesos (weights)
viéses (biases)
função de ativação (ReLU)
código em python:
import numpy as np
# Função de ativação ReLU
def relu(x):
return np.maximum(0, x)
# Derivada da ReLU (usada para ajuste dos pesos)
def relu_derivative(x):
return (x > 0).astype(float)
# Inicializa pesos e viéses com valores aleatórios
np.random.seed(42)
W1 = np.random.randn(2, 4) # pesos da entrada para camada oculta (2 entradas → 4 neurônios)
b1 = np.zeros((1, 4)) # viés da camada oculta
W2 = np.random.randn(4, 1) # pesos da camada oculta para saída (4 neurônios → 1 saída)
b2 = np.zeros((1, 1)) # viés da saída
# Dados de treinamento: queremos que a rede aprenda a somar
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]]) # entradas
y = np.array([[3], [5], [7], [9]]) # saídas esperadas
# Hiperparâmetros
learning_rate = 0.01
epochs = 1000
# Treinamento
for epoch in range(epochs):
# Forward pass
z1 = np.dot(X, W1) + b1
a1 = relu(z1)
z2 = np.dot(a1, W2) + b2
y_pred = z2 # sem ativação na saída (regressão)
# Cálculo do erro (MSE)
loss = np.mean((y_pred - y) ** 2)
# Backpropagation
d_loss = 2 * (y_pred - y) / y.size
dW2 = np.dot(a1.T, d_loss)
db2 = np.sum(d_loss, axis=0, keepdims=True)
d_a1 = np.dot(d_loss, W2.T)
d_z1 = d_a1 * relu_derivative(z1)
dW1 = np.dot(X.T, d_z1)
db1 = np.sum(d_z1, axis=0, keepdims=True)
# Atualização dos pesos e viéses
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
# Exibe o erro a cada 100 épocas
if epoch % 100 == 0:
print(f"Época {epoch} - Erro (loss): {loss:.4f}")
# Teste após o treinamento
test_input = np.array([[5, 6]])
z1 = np.dot(test_input, W1) + b1
a1 = relu(z1)
z2 = np.dot(a1, W2) + b2
prediction = z2
print("\nEntrada:", test_input)
print("Previsão (soma aproximada):", prediction[0][0])
O que está acontecendo aqui?
Parte O que faz
W1, W2 São os pesos — controlam a influência dos dados entre as camadas
b1, b2 São os viéses — deslocam a saída para melhor ajuste
ReLU Ativação que ajuda a rede a aprender não-linearidades
Backpropagation Ajusta os pesos e viéses com base no erro
Loss Mede o erro da saída da rede vs valor esperado
Saída esperada (exemplo):
Época 0 - Erro (loss): 86.5273
Época 100 - Erro (loss): 0.1234
Época 200 - Erro (loss): 0.0059
...
Entrada: [[5 6]]
Previsão (soma aproximada): 10.99
Ou seja, depois de treinar, a rede aprende que 5 + 6 ≈ 11