Aprendizado de máquina
Aprender está em loop
Um modelo de ML é treinado por looping de dados várias vezes.
Para cada iteração, os Valores de Peso são ajustados.
O treinamento é concluído quando as iterações não reduzem o custo .
Treine-me para encontrar a linha de melhor ajuste:
Gradiente descendente
Gradient Descent é um algoritmo popular para resolver problemas de IA.
Um modelo de regressão linear simples pode ser usado para demonstrar um gradiente descendente.
O objetivo de uma regressão linear é ajustar um gráfico linear a um conjunto de pontos (x,y). Isso pode ser resolvido com uma fórmula matemática. Mas um algoritmo de aprendizado de máquina também pode resolver isso.
É isso que o exemplo acima faz.
Começa com um gráfico de dispersão e um modelo linear (y = wx + b).
Em seguida, ele treina o modelo para encontrar uma linha que se encaixe no gráfico. Isso é feito alterando o peso (inclinação) e a inclinação (interceptação) da linha.
Abaixo está o código para um Trainer Object que pode resolver este problema (e muitos outros problemas).
Um objeto de treinamento
Crie um objeto Trainer que possa receber qualquer número de valores (x,y) em duas matrizes (xArr,yArr).
Defina o peso e o viés para zero.
Uma constante de aprendizado (learnnc) deve ser definida e uma variável de custo deve ser definida:
Exemplo
function Trainer(xArray, yArray) {
this.xArr = xArray;
this.yArr = yArray;
this.points = this.xArr.length;
this.learnc = 0.00001;
this.weight = 0;
this.bias = 1;
this.cost;
Função de custo
Uma maneira padrão de resolver um problema de regressão é com uma "função de custo" que mede o quão boa é a solução.
A função usa o peso e o viés do modelo (y = wx + b) e retorna um erro, com base em quão bem a linha se ajusta a um gráfico.
A maneira de calcular esse erro é percorrer todos os pontos (x,y) no gráfico e somar as distâncias quadradas entre o valor de y de cada ponto e a linha.
A maneira mais convencional é elevar ao quadrado as distâncias (para garantir valores positivos) e tornar a função de erro diferenciável.
this.costError = function() {
total = 0;
for (let i = 0; i < this.points; i++) {
total += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias)) **2;
}
return total / this.points;
}
Outro nome para a Função de Custo é Função de Erro .
A fórmula usada na função é na verdade esta:
- E é o erro (custo)
- N é o número total de observações (pontos)
- y é o valor (rótulo) de cada observação
- x é o valor (característica) de cada observação
- m é a inclinação (peso)
- b é interceptar (viés)
- mx + b é a previsão
- 1/N * N∑1 is the squared mean value
The Train Function
We will now run a gradient descent.
The gradient descent algorithm should walk the cost function towards the best line.
Each iteration should update both m and b towards a line with a lower cost (error).
To do that, we add a train function that loops over all the data many times:
this.train = function(iter) {
for (let i = 0; i < iter; i++) {
this.updateWeights();
}
this.cost = this.costError();
}
An Update Weights Function
The train function above should update the weights and biases in each iteration.
The direction to move is calculated using two partial derivatives:
this.updateWeights = function() {
let wx;
let w_deriv = 0;
let b_deriv = 0;
for (let i = 0; i < this.points; i++) {
wx = this.yArr[i] - (this.weight * this.xArr[i] + this.bias);
w_deriv += -2 * wx * this.xArr[i];
b_deriv += -2 * wx;
}
this.weight -= (w_deriv / this.points) * this.learnc;
this.bias -= (b_deriv / this.points) * this.learnc;
}
Create Your Own Library
Library Code
function Trainer(xArray, yArray) {
this.xArr = xArray;
this.yArr = yArray;
this.points = this.xArr.length;
this.learnc = 0.000001;
this.weight = 0;
this.bias = 1;
this.cost;
// Cost Function
this.costError = function() {
total = 0;
for (let i = 0; i < this.points; i++) {
total += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias)) **2;
}
return total / this.points;
}
// Train Function
this.train = function(iter) {
for (let i = 0; i < iter; i++) {
this.updateWeights();
}
this.cost = this.costError();
}
// Update Weights Function
this.updateWeights = function() {
let wx;
let w_deriv = 0;
let b_deriv = 0;
for (let i = 0; i < this.points; i++) {
wx = this.yArr[i] - (this.weight * this.xArr[i] + this.bias);
w_deriv += -2 * wx * this.xArr[i];
b_deriv += -2 * wx;
}
this.weight -= (w_deriv / this.points) * this.learnc;
this.bias -= (b_deriv / this.points) * this.learnc;
}
} // End Trainer Object
Now you can include the library in HTML:
<script src="myailib.js"></script>