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:

Fórmula
  • 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>