点击上方“进修编程”,选择“星标”公众号
超级无敌干货,第一时间送达!!!
优化算法是机器学习模型的支柱,因为它们使建模过程能够从给定的数据集中学习。这些算法用于找到目标函数的最小值或最大值,在机器学习环境中,目标函数代表误差或损失。在本文中,讨论了不同的优化方法及其在机器学习中的用途和重要性。
理解机器学习中的优化
机器学习中的优化算法类型
理解机器学习中的优化
优化是从可用的各种可行解决方案中选择最佳解决方案的过程。换句话说,优化可以定义为获取给定函数的最佳值或最小值的一种方式。在大多数问题中,目标函数 f(x) 受到约束,目的是确定最小化或最大化 f(x) 的 𝑥x 值。
关键概念:
目标函数:需要优化的目标或函数是利润函数。
变量:以下是需要调整的参数:
约束:解决方案必须满足的约束。
可行区域:在现有约束条件下可行的所有潜在解决方案的子集。
机器学习中的优化算法类型
优化算法有很多种,每种都有其优点和缺点。这些算法大致可以分为两类:一阶算法和二阶算法。
1. 一阶算法
梯度下降
随机优化技术
进化算法
元启发式优化
群体智能算法
超参数优化
深度学习中的优化
1.1 梯度下降及其变体
梯度下降是一种基本优化算法,用于通过迭代向最小值移动来最小化目标函数。它是一种一阶迭代算法,用于查找可微分多元函数的局部最小值。该算法的工作原理是沿当前点处函数梯度(或近似梯度)的相反方向重复步骤,因为这是最陡峭的下降方向。
假设我们想使用梯度下降来最小化函数 f(x)=x 2 。
import numpy as np
# Define the gradient function for f(x) = x^2
def gradient(x):
return 2 * x
# Gradient descent optimization function
def gradient_descent(gradient, start, learn_rate, n_iter=50, tolerance=1e-06):
vector = start
for _ in range(n_iter):
diff = -learn_rate * gradient(vector)
if np.all(np.abs(diff) <= tolerance):
break
vector += diff
return vector
# Initial point
start = 5.0
# Learning rate
learn_rate = 0.1
# Number of iterations
n_iter = 50
# Tolerance for convergence
tolerance = 1e-6
# Gradient descent optimization
result = gradient_descent(gradient, start, learn_rate, n_iter, tolerance)
print(result)
输出
7.136238463529802e-05
梯度下降的变体:
随机梯度下降 (SGD):此变体建议每次使用单个训练示例来更新模型,这不需要大量计算,因此适用于大型数据集。因此,它们是随机的,可能会产生嘈杂的更新,因此可能需要仔细选择学习率。
小批量梯度下降:这种方法的设计方式是针对每个小批量数据进行计算,以平衡时间和精度。它比 SGD 收敛得更快,在实践中被广泛用于训练许多深度学习模型。
动量:动量通过将算法前几步的信息添加到下一步来改进 SGD。通过将当前更新向量的一部分添加到上一次更新中,它使算法能够穿透平坦区域和噪声梯度,以帮助最大限度地缩短训练和寻找收敛的时间。
1.2 随机优化技术
随机优化技术为搜索过程引入了随机性,这对于解决传统方法可能难以解决的复杂、非凸优化问题非常有利。
模拟退火:受冶金学中的退火过程的启发,该技术从高温(高随机性)开始,允许广泛探索搜索空间。随着时间的推移,温度会降低(随机性会降低),模仿金属的冷却,这有助于算法收敛到更好的解决方案,同时避免局部最小值。
随机搜索:这种简单的方法会随机选择搜索空间中的点,然后对其进行评估。虽然这种方法可能看起来很幼稚,但实际上它非常有效,特别是对于高维或不太理解的优化景观。这种方法易于实施,并且能够作为更复杂算法的基准,因此很有吸引力。此外,随机搜索也可能成为使用其他优化方法的更广泛策略的一部分。
使用随机优化算法时,必须考虑以下实际方面:
重复评估:随机优化算法通常需要对目标函数进行重复评估,这可能非常耗时。因此,平衡评估次数和可用的计算资源至关重要。
问题结构:随机优化算法的选择取决于问题的结构。例如,模拟退火适用于具有多个局部最优值的问题,而随机搜索对于高维优化景观有效。
1.3 进化算法
进化算法的灵感来自自然选择,包括遗传算法和差分进化等技术。它们通常用于解决使用传统方法难以或无法解决的复杂优化问题。
关键组件:
群体:优化问题的一组候选解。
适应度函数:评估每个候选解决方案的质量的函数。
选择:一种挑选最适合繁殖的候选者进行繁殖的机制。
遗传算子:修改选定候选者以创建新后代的算子,例如交叉和变异。
终止:停止算法的条件,例如达到最大代数或令人满意的适应度水平。
1.3.1 遗传算法
这些算法使用交叉和变异算子来进化种群。通常用于依靠突变、交叉和选择等受生物启发的算子来生成优化和搜索问题的高质量解决方案。
import numpy as np
# Define the fitness function (negative of the objective function)
def fitness_func(individual):
return -np.sum(individual**2)
# Generate an initial population
def generate_population(size, dim):
return np.random.rand(size, dim)
# Genetic algorithm
def genetic_algorithm(population, fitness_func, n_generations=100, mutation_rate=0.01):
for _ in range(n_generations):
population = sorted(population, key=fitness_func, reverse=True)
next_generation = population[:len(population)//2].copy()
while len(next_generation) < len(population):
parents_indices = np.random.choice(len(next_generation), 2, replace=False)
parent1, parent2 = next_generation[parents_indices[0]], next_generation[parents_indices[1]]
crossover_point = np.random.randint(1, len(parent1))
child = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))
if np.random.rand() < mutation_rate:
mutate_point = np.random.randint(len(child))
child[mutate_point] = np.random.rand()
next_generation.append(child)
population = np.array(next_generation)
return population[0]
# Parameters
population_size = 10
dimension = 5
n_generations = 50
mutation_rate = 0.05
# Initialize population
population = generate_population(population_size, dimension)
# Run genetic algorithm
best_individual = genetic_algorithm(population, fitness_func, n_generations, mutation_rate)
# Output the best individual and its fitness
print("Best individual:", best_individual)
print("Best fitness:", -fitness_func(best_individual)) # Convert back to positive for the objective value
输出
最佳个体:[0.00984929 0.1977604 0.23653838 0.06009506 0.18963357]
最佳适应度:0.13472889681171485
1.3.2 差异进化(DE)
另一种进化算法是差分进化,它通过对候选解决方案的改进来寻求问题的最优解。它的工作原理是通过称为向量加法的操作从种群中产生新的候选解决方案。DE 通常通过突变和交叉操作来执行,以创建新的向量并替换种群中拟合度较低的个体。
import numpy as np
def differential_evolution(objective_func, bounds, pop_size=50, max_generations=100, F=0.5, CR=0.7, seed=None):
np.random.seed(seed)
n_params = len(bounds)
population = np.random.uniform(bounds[:, 0], bounds[:, 1], size=(pop_size, n_params))
best_solution = None
best_fitness = np.inf
for generation in range(max_generations):
for i in range(pop_size):
target_vector = population[i]
indices = [idx for idx in range(pop_size) if idx != i]
a, b, c = population[np.random.choice(indices, 3, replace=False)]
mutant_vector = np.clip(a + F * (b - c), bounds[:, 0], bounds[:, 1])
crossover_mask = np.random.rand(n_params) < CR
trial_vector = np.where(crossover_mask, mutant_vector, target_vector)
trial_fitness = objective_func(trial_vector)
if trial_fitness < best_fitness:
best_fitness = trial_fitness
best_solution = trial_vector
if trial_fitness <= objective_func(target_vector):
population[i] = trial_vector
return best_solution, best_fitness
# Example objective function (minimization)
def sphere_function(x):
return np.sum(x**2)
# Define the bounds for each parameter
bounds = np.array([[-5.12, 5.12]] * 10) # Example: 10 parameters in [-5.12, 5.12] range
# Run Differential Evolution
best_solution, best_fitness = differential_evolution(sphere_function, bounds)
# Output the best solution and its fitness
print("Best solution:", best_solution)
print("Best fitness:", best_fitness)
输出
最佳解决方案:[-0.00483127 -0.00603634 -0.00148056 -0.01491845 0.00767046 -0.00383069
0.00337179 -0.00531313 -0.00163351 0.00201859]
最佳适应度:0.0004043821293858739
1.4 元启发式优化
元启发式优化算法用于提供策略来指导用于优化困难搜索空间的较低级别的启发式技术。这是一个很好的机会,因为从对文献的简单调查中,人们感觉到这种形式的算法特别适用于主要优化方法因大型复杂或非线性和/或多模态目标而失败的情况。
下面,我们探讨两个突出的元启发式算法的例子:禁忌搜索和迭代局部搜索是两种用于增强局部搜索算法能力的技术。
1.4.1 禁忌搜索
本节介绍禁忌搜索作为一种提高局部搜索算法效率的方法,该算法使用记忆结构,其特殊目的是避免先前解决方案形式的陷阱,有助于摆脱局部最优。
关键组件:
禁忌列表:这是一种短期记忆,用于存储上次访问的解决方案或解决方案的段属性。导致这些解决方案的那些模式被称为“禁忌”,即禁止,以避免进入循环。
愿望标准:这是所选方法中最重要的元素,因为如果朝某个方向的移动导致的得分明显优于迄今为止已知的最佳得分,那么它就会释放禁忌解决方案,并允许搜索返回到潜在有价值的领域。
邻域搜索:研究当前解决方案的其他次优解决方案,并选择禁忌列表之外的最佳移动。如果所有移动都是禁忌,则选择具有期望标准的最佳移动。
强化和多样化:算法的主要概念简要如下:强化针对的是高质量解决方案附近的区域。这对于确保解决方案不局限于局部最优解决方案至关重要。
禁忌搜索的工作原理
初始化:从初始解决方案和空的禁忌列表开始,以创建特殊的数据结构。
迭代:
在每个阶段围绕一个特定的解决方案产生若干个解决方案;
选择最有效的举动,该举动不被禁忌表禁止,或当禁忌表禁止时,选择符合愿望水平的举动。
作为该过程的一部分,在禁忌列表中记录所选的举动。
在提出的算法中,如果新解决方案优于最佳已知解决方案,那么最佳已知解决方案将被更新。
终止:该过程持续几个循环或直到解决方案被优化,并且经过几个计算循环后兴趣停止增加。
import numpy as np
def perturbation(solution, perturbation_size=0.1):
perturbed_solution = solution + perturbation_size * np.random.randn(len(solution))
return np.clip(perturbed_solution, -5.12, 5.12) # Example bounds
def local_search(solution, objective_func, max_iterations=100):
best_solution = solution.copy()
best_fitness = objective_func(best_solution)
for _ in range(max_iterations):
neighbor_solution = perturbation(solution)
neighbor_fitness = objective_func(neighbor_solution)
if neighbor_fitness < best_fitness:
best_solution = neighbor_solution
best_fitness = neighbor_fitness
return best_solution, best_fitness
def iterated_local_search(initial_solution, objective_func, max_iterations=100, perturbation_size=0.1):
best_solution = initial_solution.copy()
best_fitness = objective_func(best_solution)
for _ in range(max_iterations):
perturbed_solution = perturbation(best_solution, perturbation_size)
local_best_solution, local_best_fitness = local_search(perturbed_solution, objective_func)
if local_best_fitness < best_fitness:
best_solution = local_best_solution
best_fitness = local_best_fitness
return best_solution, best_fitness
# Example objective function (minimization)
def sphere_function(x):
return np.sum(x**2)
# Define the initial solution and parameters
initial_solution = np.random.uniform(-5.12, 5.12, size=10) # Example: 10-dimensional problem
max_iterations = 100
perturbation_size = 0.1
# Run Iterated Local Search
best_solution, best_fitness = iterated_local_search(initial_solution, sphere_function, max_iterations, perturbation_size)
# Output the best solution and its fitness
print("Best solution:", best_solution)
print("Best fitness:", best_fitness)
输出
最佳解决方案:[-0.05772395 -0.09372537 -0.00320419 -0.04050688 -0.06859316 0.04631486
-0.03888189 0.01871441 -0.06365841 -0.01158897]
最佳适应度:0.026666386292898886
1.5 群体智能算法
群体智能算法模拟这样的系统,主要原因如下:群体智能源自现存不同生物的分布式行为;影响群体智能分散化的有组织系统包括鸟群、鱼群和昆虫群。这些算法可以应用所有实体共享的简单规则,并能够利用个体(称为代理)之间的交互,基于相互合作解决优化问题。
在众多群体智能算法中,最常用的两种算法是粒子群优化算法 (PSO) 和蚁群优化算法 (ACO)。在这里,我们将详细解释这两种算法:
1.5.1 粒子群优化(PSO)
粒子群优化(PSO) 是一种优化技术,其中潜在解决方案的种群利用鸟群或鱼群的社会行为来解决问题。在群体内部,每个部分都称为一个粒子,具有提供解决方案的潜力。粒子在群体中的搜索空间中漫游,并根据自己的知识以及附近所有其他粒子的知识在这些步骤上改变位置。
下面是用 Python 编写的 PSO 的简单实现,用于最小化 Rastrigin 函数:
import numpy as np
def rastrigin(x):
return 10 * len(x) + sum([(xi ** 2 - 10 * np.cos(2 * np.pi * xi)) for xi in x])
class Particle:
def __init__(self, bounds):
self.position = np.random.uniform(bounds[:, 0], bounds[:, 1], len(bounds))
self.velocity = np.random.uniform(-1, 1, len(bounds))
self.pbest_position = self.position.copy()
self.pbest_value = float('inf')
def update_velocity(self, gbest_position, w=0.5, c1=1.0, c2=1.5):
r1 = np.random.rand(len(self.position))
r2 = np.random.rand(len(self.position))
cognitive_velocity = c1 * r1 * (self.pbest_position - self.position)
social_velocity = c2 * r2 * (gbest_position - self.position)
self.velocity = w * self.velocity + cognitive_velocity + social_velocity
def update_position(self, bounds):
self.position += self.velocity
self.position = np.clip(self.position, bounds[:, 0], bounds[:, 1])
def particle_swarm_optimization(objective_func, bounds, n_particles=30, max_iter=100):
particles = [Particle(bounds) for _ in range(n_particles)]
gbest_position = np.random.uniform(bounds[:, 0], bounds[:, 1], len(bounds))
gbest_value = float('inf')
for _ in range(max_iter):
for particle in particles:
fitness = objective_func(particle.position)
if fitness < particle.pbest_value:
particle.pbest_value = fitness
particle.pbest_position = particle.position.copy()
if fitness < gbest_value:
gbest_value = fitness
gbest_position = particle.position.copy()
for particle in particles:
particle.update_velocity(gbest_position)
particle.update_position(bounds)
return gbest_position, gbest_value
# Define bounds
bounds = np.array([[-5.12, 5.12]] * 10)
# Run PSO
best_solution, best_fitness = particle_swarm_optimization(rastrigin, bounds, n_particles=30, max_iter=100)
# Output the best solution and its fitness
print("Best solution:", best_solution)
print("Best fitness:", best_fitness)
输出
最佳解决方案:[-9.15558003e-05 -9.94812776e-01 9.94939296e-01 1.39792054e-05
-9.94876021e-01 -1.99009730e+00 -9.94991063e-01 -9.94950915e-01
2.69717923e-04 -1.13617762e-04]
最佳个体:8.95465...
1.5.2 蚁群优化(ACO)
蚁群优化算法的灵感来源于蚂蚁的觅食行为。蚂蚁通过释放信息素来寻找从蚁群到食物源的最短路径,从而引导其他蚂蚁找到这条路径。
以下是针对旅行商问题 (TSP) 的 ACO 的基本实现:
import numpy as np
class Ant:
def __init__(self, n_cities):
self.path = []
self.visited = [False] * n_cities
self.distance = 0.0
def visit_city(self, city, distance_matrix):
if len(self.path) > 0:
self.distance += distance_matrix[self.path[-1]][city]
self.path.append(city)
self.visited[city] = True
def path_length(self, distance_matrix):
return self.distance + distance_matrix[self.path[-1]][self.path[0]]
def ant_colony_optimization(distance_matrix, n_ants=10, n_iterations=100, alpha=1, beta=5, rho=0.1, Q=10):
n_cities = len(distance_matrix)
pheromone = np.ones((n_cities, n_cities)) / n_cities
best_path = None
best_length = float('inf')
for _ in range(n_iterations):
ants = [Ant(n_cities) for _ in range(n_ants)]
for ant in ants:
ant.visit_city(np.random.randint(n_cities), distance_matrix)
for _ in range(n_cities - 1):
current_city = ant.path[-1]
probabilities = []
for next_city in range(n_cities):
if not ant.visited[next_city]:
pheromone_level = pheromone[current_city][next_city] ** alpha
heuristic_value = (1.0 / distance_matrix[current_city][next_city]) ** beta
probabilities.append(pheromone_level * heuristic_value)
else:
probabilities.append(0)
probabilities = np.array(probabilities)
probabilities /= probabilities.sum()
next_city = np.random.choice(range(n_cities), p=probabilities)
ant.visit_city(next_city, distance_matrix)
for ant in ants:
length = ant.path_length(distance_matrix)
if length < best_length:
best_length = length
best_path = ant.path
pheromone *= (1 - rho)
for ant in ants:
contribution = Q / ant.path_length(distance_matrix)
for i in range(n_cities):
pheromone[ant.path[i]][ant.path[(i + 1) % n_cities]] += contribution
return best_path, best_length
# Example distance matrix for a TSP with 5 cities
distance_matrix = np.array([
[0, 2, 2, 5, 7],
[2, 0, 4, 8, 2],
[2, 4, 0, 1, 3],
[5, 8, 1, 0, 6],
[7, 2, 3, 6, 0]
])
# Run ACO
best_path, best_length = ant_colony_optimization(distance_matrix)
# Output the best path and its length
print("Best path:", best_path)
print("Best length:", best_length)
输出
最佳路径:[1, 0, 2, 3, 4]
最佳长度:13.0
1.6.超参数优化
不直接适应数据集的模型参数调整称为超参数调整,是机器学习中的一个重要过程。这些被称为超参数的参数可能会影响某个模型的性能。调整它们对于充分发挥模型的性能至关重要,因为理论上模型会发挥最佳性能。
网格搜索:与其他类型的算法类似,网格搜索旨在优化超参数。它需要确定一组特定的超参数值,然后训练模型并针对每个值进行测试。然而,这是一个耗时的过程,无论是计算时间还是处理大型数据集和复杂模型的时间,尽管网格搜索在计算上很昂贵,但它很有前景,可以确保模型找到网格中给定的超参数的最佳值。它通常适用于计算资源大量可用且参数空间与总体空间相比有限的情况。
随机搜索:至于随机搜索方法,可以注意到它比网格搜索更合理,因为超参数是从给定分布中随机选择的。此方法不提供最佳超参数,但通常提供在比网格搜索更短的时间内合理优化的参数集。在处理大型高维参数空间时,随机搜索非常有用且效率更高,因为它涵盖了更多的超参数领域。
1.7.深度学习中的优化技术
深度学习模型通常很复杂,有些模型包含数百万个参数。这些模型高度依赖于优化技术,这些技术使它们能够有效地进行训练,并能够对未知数据进行泛化。不同的优化器会影响收敛速度和模型输出结果的质量。常见的技术有:
Adam(自适应矩估计): Adam 源自另外两种技术,即 AdaGrad 和 RMSProp;它是一种广泛使用的优化技术。在每个时间步骤中,Adam 都会跟踪梯度及其二阶矩移动平均值。它用于修改过程中每个参数的学习率。它们中的大多数计算效率高,内存需求小,并且特别适用于大数据和参数。
RMSProp(均方根传播): RMSProp 旨在优化每个参数的梯度学习率。它通过关注梯度随时间的变化来具体化学习率,从而降低梯度消失和爆炸的风险。RMSProp 保持梯度平方的移动平均值,并根据梯度幅度调整每个参数的学习率。
2.二阶算法
1.牛顿法和拟牛顿法
2.约束优化
贝叶斯优化
2.1 牛顿法和拟牛顿法
牛顿法和拟牛顿法是用于寻找函数最小值或最大值的优化技术。它们基于迭代更新函数 Hessian 矩阵估计值的思想,以改进搜索方向。
2.1.1. 牛顿法
牛顿法基于二阶导数来最小化或最大化二次型。它比梯度下降等一阶方法具有更快的收敛速度,但需要计算二阶导数或 Hessian 矩阵,这在维度较高时会带来很大的挑战。
让我们考虑函数 f(x)=x 3 −2x 2 +2 并使用牛顿法找到它的最小值:
# Define the function and its first and second derivatives
def f(x):
return x**3 - 2*x**2 + 2
def f_prime(x):
return 3*x**2 - 4*x
def f_double_prime(x):
return 6*x - 4
def newtons_method(f_prime, f_double_prime, x0, tol=1e-6, max_iter=100):
x = x0
for _ in range(max_iter):
step = f_prime(x) / f_double_prime(x)
if abs(step) < tol:
break
x -= step
return x
# Initial point
x0 = 3.0
# Tolerance for convergence
tol = 1e-6
# Maximum iterations
max_iter = 100
# Apply Newton's Method
result = newtons_method(f_prime, f_double_prime, x0, tol, max_iter)
print("Minimum at x =", result)
输出
x 处的最小值 = 1.3333333423743772
2.1.2 拟牛顿法
拟牛顿法有其他替代方案,例如 BFGS(Broyden-Fletcher-Goldfarb-Shanno)和 L-BFGS(有限内存 BFGS),适用于大规模优化,因为直接计算 Hessian 矩阵更具挑战性。
BFGS:BFGS 等方法根据梯度构建 Hessian 矩阵的估计值。它以迭代方式重复此近似值,从而获得与牛顿法相当的快速收敛速度,而无需计算 Hessian 形式。
L-BFGS:L-BFGS 是 BFGS 的内存高效版本,适用于解决大规模问题。它仅维护几次迭代的更新,从而实现更高的可扩展性,同时又不牺牲 BFGS 收敛的特性。
2.2 约束优化
拉格朗日乘数:该方法引入了附加变量(称为拉格朗日乘数),以便将受约束的问题转变为不受约束的问题。它专为具有等式约束的问题而设计,可以找出目标函数和约束都得到最佳满足的点。
KKT 条件:这些条件将拉格朗日乘数的条件推广到包含等式和不等式约束。它们用于给出包含原始可行性、对偶可行性以及互补松弛性的解决方案的优化必要条件,从而扩展了约束优化中考虑的问题范围。
2.3 贝叶斯优化
贝叶斯优化是一种强大的方法,可以优化需要很长时间才能评估的目标函数。它对于目标函数复杂、噪声大和/或评估成本高的优化问题特别有用。贝叶斯优化提供了一种原则性的技术,用于指导高效且有效的全局优化问题搜索。与网格和随机搜索方法相比,贝叶斯优化建立在有关先前评估的信息之上,因此能够就某些超参数的进一步评估做出合理的决策。这使得搜索算法的工作效率更高,并且在许多情况下,在达到最佳超参数之前需要的迭代次数更少。这对于评估成本高的函数甚至在大量计算约束下尤其有益。
贝叶斯优化是一种基于概率模型的方法,用于寻找评估成本高的函数的最小值。
# First, ensure you have the necessary library installed:
# pip install scikit-optimize
from skopt import gp_minimize
from skopt.space import Real
# Define the function to be minimized
def objective_function(x):
return (x[0] - 2) ** 2 + (x[1] - 3) ** 2 + 1
# Define the dimensions (search space)
dimensions = [Real(-5.0, 5.0), Real(-5.0, 5.0)]
# Implement Bayesian Optimization
def bayesian_optimization(func, dimensions, n_calls=50):
result = gp_minimize(func, dimensions, n_calls=n_calls)
return result.x, result.fun
# Run Bayesian Optimization
best_params, best_score = bayesian_optimization(objective_function, dimensions)
# Output the best parameters and the corresponding function value
print("Best parameters:", best_params)
print("Best score:", best_score)
针对特定机器学习任务的优化
1.分类任务:逻辑回归优化
逻辑回归是一种对象分类算法,广泛应用于二分类任务。它利用逻辑函数估计一个实例属于某个类的可能性。优化目标是交叉熵,即预测概率与实际类标签之间差异的度量。逻辑回归的优化过程:
定义并拟合模型
f sklearn.linear_model i LogisticRegression
模型 = LogisticRegression()
模型.f(X_train,y_train)
优化细节:
优化器:对于逻辑回归,采用某些算法来优化模型,即牛顿法或梯度下降,并根据数据集的大小和密度使用特定的求解器(例如,“lbfgs”,“sag”,“saga”)。
损失函数:逻辑回归的代价函数是对数损失或交叉熵,进行计算是为了对其进行优化。
评估:
训练后,根据分类问题使用准确度、精确度、召回率或 ROC-AUC 等指标评估模型的性能。
2.回归任务:线性回归优化
线性回归是回归家族中的一个重要方法,因为该算法的目的涉及预测目标变量。优化模型的共同目标通常是最小化均方误差,该误差表示预测值与实际目标值之间的差异。线性回归的优化过程:
定义并拟合模型
f sklearn.linear_model i LinearRegression
模型 = LinearR()
模型.f(X_train,y_train)
优化细节:
优化器:与线性回归一样,采用某些算法来优化模型,即牛顿法或梯度下降,并根据数据集的大小和密度使用特定的求解器(例如,“lbfgs”,“sag”,“saga”)。
损失函数:线性回归的损失函数是均方误差(MSE),在训练期间将其最小化。
评估:训练后,根据分类问题使用准确度、精确度、召回率或 ROC-AUC 等指标评估模型的性能。
优化算法的挑战和局限性
非凸性:许多机器学习算法的成本函数已被证实是非凸的,这意味着它们具有许多局部最小值和鞍点。传统的优化方法无法保证在如此复杂的环境中获得全局最优,因此只能产生次优解决方案。
高维度:现代机器学习应用中使用的深度神经网络规模不断扩大,这往往意味着这些网络参数的维度非常高。在如此高维的空间中寻找这些最优解非常具有挑战性,而寻找这些解所需的算法和计算资源在时间和计算能力上可能非常昂贵。
过度拟合:正则化对于消除过度拟合至关重要,过度拟合是一种学习形式,它会导致记住训练数据而不是新数据。由于过度拟合的风险很高,优化所应用的模型要求应尽可能简单。
结论
优化是任何机器学习模型成功的关键要素。事实上,从梯度下降到贝叶斯优化和群体智能,这些方法都允许模型学习和注入。对优化算法的正确了解可以提高大多数机器学习应用程序的性能和准确性。
python、matlab程序设计找我!
— 完 —