2. Método de optimización: descenso de gradiente (BGD, SGD, Min_BGD)

Uno, función de pérdida

La función de pérdida se usa generalmente para estimar el valor predicho del modelo f (x) f (x)El grado de inconsistencia entre f ( x ) y el valor verdadero Y. Es una función de valor real no negativo, dondeL (Y, f (x)) L (Y, f (x))L ( Y ,f ( x ) ) significa. Cuanto menor sea el valor de la pérdida, mejor será la solidez del modelo.

La función de pérdida es la parte central de la función de riesgo empírico y una parte importante de la función de riesgo estructural.

La función de riesgo resultante del modelo incluye términos de riesgo empíricos y términos regulares, que generalmente se expresan de la siguiente manera:
Inserte la descripción de la imagen aquí

1.1 Función de pérdida cuadrática media

Usando el método de mínimos cuadrados, el principio básico es que la curva de mejor ajuste debe minimizar la distancia desde todos los puntos a la línea de regresión. La distancia euclidiana se usa generalmente para medir la distancia. La función de pérdida de la pérdida cuadrática media es la siguiente:
L (Y ∣ f (X)) = ∑ (Y - f (X)) 2 L (Y | f (X)) = \ sum (Yf (X)) ^ {2}L ( Y f ( X ) )=(Y-f ( X ) )2

1.2 función de pérdida de registro de registro

La función de pérdida de regresión logística es la función de pérdida logarítmica.

L (Y ∣ f (X)) = - log P (Y ∣ X) L (Y | f (X)) = - logP (Y | X) L ( Y f ( X ) )=- l o g P ( Y X )

1.3 Función de pérdida exponencial

AdaBoost es la función de pérdida exponencial. Su forma estándar es la siguiente:
L (Y ∣ f (X)) = exp [- yf (x)] L (Y | f (X)) = exp [-yf (x)]L ( Y f ( X ) )=e x p [ - y f ( x ) ]

Dos, método de optimización

El problema de optimización se refiere a la función objetivo dada L (Y ∣ f (X)) L (Y | f (X))L ( Y f ( X ) ) , necesitamos encontrar un conjunto de parámetros X tal queL (Y ∣ f (X)) L (Y | f (X))El valor de L ( Y f ( X ) ) es el más pequeño. En el entorno del aprendizaje automático, hay tres formas de descenso de gradiente, a saber: descenso de gradiente por lotes (BGD), descenso de gradiente estocástico (SGD) y descenso de gradiente por mini lotes (Min_BGD).

2.1 Descenso de gradiente por lotes (BGD)

La idea básica: la forma más primitiva del método de descenso de gradiente, su idea específica es que al actualizar cada parámetro, todas las muestras se utilizan para actualizar.

Ventajas: solución óptima global, fácil de implementar en paralelo;

Desventajas: cuando el número de muestras es grande, el proceso de formación será muy lento.

Asunto: El tamaño de la muestra es relativamente pequeño.

import numpy as np
import matplotlib.pyplot as plt

def BGD(x_vals, y_vals):

    alpha = 0.001  # 步长
    loop_max = 100     # 迭代次数
    theta = np.random.randn(2)  # 存储 权重、偏移量
    m = len(x_vals)
    b = np.full(m, 1.0)
    x_vals = np.vstack([b, x_vals]).T
    error = np.zeros(2)
    for i in range(loop_max):
        sum_m = np.zeros(2)
        for j in range(m):
            dif = (np.matmul(theta, x_vals[j]) - y_vals[j]) * x_vals[j]
            sum_m = sum_m + dif
        theta = theta - alpha * sum_m
        if np.linalg.norm(theta - error) < 0.001:
            break
        else:
            error = theta
        print('loop count = %d' % i, '\t theta:',theta)
    return theta

if __name__ == '__main__':
    np.random.seed(0)
    # iris = datasets.load_iris()
    # x_vals = np.array([x[3] for x in iris.data])
    # y_vals = np.array([y[0] for y in iris.data])
    x_vals = np.arange(0., 10., 0.2)
    y_vals = 2 * x_vals + 5 + np.random.randn(len(x_vals))
    theta = BGD(x_vals, y_vals)

    #  画图
    plt.plot(x_vals, y_vals, 'g*')
    plt.plot(x_vals, theta[1] * x_vals + theta[0], 'r')
    plt.show()

Inserte la descripción de la imagen aquí

2.2 Descenso de gradiente estocástico (SGD)

La idea básica: en cada iteración, se actualiza una muestra.

Ventajas: velocidad de entrenamiento rápida;

Desventajas: Precisión reducida, no óptima global; no es fácil de implementar en paralelo.

Objeto: el número de muestras es demasiado grande o es un algoritmo en línea.

import numpy as np
import matplotlib.pyplot as plt

def SGD(x_vals, y_vals):

    alpha = 0.01  # 步长
    loop_max = 100     # 迭代次数
    theta = np.random.randn(2)  # 存储 权重、偏移量
    m = len(x_vals)
    b = np.full(m, 1.0)
    x_vals = np.vstack([b, x_vals]).T
    error = np.zeros(2)
    np.random.seed(0)
    for i in range(loop_max):

        for j in range(m):
            dif = np.matmul(theta, x_vals[j]) - y_vals[j]
            theta = theta - alpha * dif * x_vals[j]

        if np.linalg.norm(theta - error) < 0.001:
            break
        else:
            error = theta

        print('loop count = %d' % i, '\t theta:',theta)
    return theta

if __name__ == '__main__':

    x_vals = np.arange(0., 10., 0.2)
    y_vals = 2 * x_vals + 5 + np.random.randn(len(x_vals))

    theta = SGD(x_vals, y_vals)

    #  画图
    plt.plot(x_vals, y_vals, 'g*')
    plt.plot(x_vals, theta[1] * x_vals + theta[0], 'r')
    plt.show()

Inserte la descripción de la imagen aquí

2.3 Descenso de gradiente de lotes pequeños (Min_BGD)

Idea básica: combinando las ideas de BGD y SGD, use una parte de los datos para la operación BGD en cada iteración.

Ventajas: para superar las deficiencias de los dos métodos anteriores, teniendo en cuenta las ventajas de ambos métodos;

Objeto: . En la situación general actual.

import numpy as np
import matplotlib.pyplot as plt

def min_batch(x_vals, y_vals):

    alpha = 0.01  # 步长
    loop_max = 100     # 迭代次数
    batch_size=5
    theta = np.random.randn(2)  # 存储 w、b
    m = len(x_vals)

    b = np.full(m, 1.0)
    x_vals = np.vstack([b, x_vals]).T

    error = np.zeros(2)
    np.random.seed(0)
    for j in range(loop_max):
        for i in range(1,m,batch_size):
            sum_m = np.zeros(2)
            for k in range(i-1,i+batch_size-1,1):
                dif = (np.dot(theta, x_vals[k]) - y_vals[k]) *x_vals[k]
                sum_m = sum_m + dif
            theta = theta- alpha * (1.0/batch_size) * sum_m

        if np.linalg.norm(theta - error) < 0.001:
            break
        else:
            error = theta

        print('loop count = %d' % j, '\t theta:',theta)
    return theta

if __name__ == '__main__':

    x_vals = np.arange(0., 10., 0.2)
    y_vals = 2 * x_vals + 5 + np.random.randn(len(x_vals))

    theta = min_batch(x_vals, y_vals)

    #  画图
    plt.plot(x_vals, y_vals, 'g*')
    plt.plot(x_vals, theta[1] * x_vals + theta[0], 'r')
    plt.show()

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_41044112/article/details/108063783
Recomendado
Clasificación