我刚开始学习机器学习并学习了一些基本算法,我的脑海中有一个愚蠢的疑问,我无法找到答案。我们实际上在机器学习算法中研究什么,这些算法根据提供给算法的数据来解决各种问题?
以线性回归为例:
我们提供数据。
我们告诉机器如何计算误差。
使用梯度下降,我们也告诉机器如何优化,并基于以上所有优化参数出来。
为什么这个算法里居然有“学习”这个词?尽管我们是如何执行步骤的人,并且我们已经提供了该算法中的所有数学知识。
我刚开始学习机器学习并学习了一些基本算法,我的脑海中有一个愚蠢的疑问,我无法找到答案。我们实际上在机器学习算法中研究什么,这些算法根据提供给算法的数据来解决各种问题?
以线性回归为例:
我们提供数据。
我们告诉机器如何计算误差。
使用梯度下降,我们也告诉机器如何优化,并基于以上所有优化参数出来。
为什么这个算法里居然有“学习”这个词?尽管我们是如何执行步骤的人,并且我们已经提供了该算法中的所有数学知识。
我想指出以前的答案中没有充分反映的一个方面。当您从线性回归开始时,您基本上 I)提出了一些模型(一种表示和之间关系的方法),例如线性函数,并且 II)您指定了损失函数(残差平方和)。目的是找到系数(或权重),映射到,这样就没有“更好的方法”来预测(即最小化残差平方和)。
在线性回归的情况下,您有两个选择:分析解决问题或通过梯度体面解决问题。最佳系数/权重(向量 beta)由下式给出:
所以在这种情况下不需要梯度下降。它只是简单的矩阵代数。
这是 R 中的一个最小示例,演示了它是如何工作的:
资料来源:https ://www.r-bloggers.com/regression-via-gradient-descent-in-r/
# Input some data
x0 <- c(1,1,1,1,1)
x1 <- c(1,2,3,4,5)
x2 <- c(8,4,3,1,8)
x <- as.matrix(cbind(x0,x1,x2))
y <- as.matrix(c(3,7,5,11,14))
# (X'X)^-1 X'y
beta1 = solve(t(x)%*%x) %*% t(x)%*%y
# R's regression command
beta2 = summary(lm(y ~ x[, 2:3]))
# Gradient decent
m <- nrow(y)
grad <- function(x, y, theta) {
gradient <- (1/m)* (t(x) %*% ((x %*% t(theta)) - y))
return(t(gradient))
}
# Define gradient descent update algorithm
grad.descent <- function(x, maxit){
theta <- matrix(c(0, 0, 0), nrow=1) # Initialize the parameters
alpha = .05 # Learning rate
for (i in 1:maxit) {
theta <- theta - alpha * grad(x, y, theta)
}
return(theta)
}
# Results
print(grad.descent(x,2000))
print(beta1)
print(beta2)
结果:
> print(grad.descent(x,2000))
x0 x1 x2
[1,] -0.672238 2.6459 0.1530299
> print(beta1)
[,1]
x0 -0.6722955
x1 2.6459103
x2 0.1530343
> print(beta2)
Call:
lm(formula = y ~ x[, 2:3])
Residuals:
1 2 3 4 5
-0.1979 1.7683 -2.7245 0.9356 0.2185
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.6723 3.3565 -0.200 0.8598
x[, 2:3]x1 2.6459 0.7677 3.447 0.0748 .
x[, 2:3]x2 0.1530 0.3897 0.393 0.7325
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.399 on 2 degrees of freedom
Multiple R-squared: 0.8561, Adjusted R-squared: 0.7122
F-statistic: 5.949 on 2 and 2 DF, p-value: 0.1439
正如你所看到的,解决问题并没有多少机器参与(当然除了做数学)。那么为什么要机器学习呢?计算能力的提高使得使用梯度体面解决非常复杂的问题成为可能。我们的想法是,您从简单的解决方案出发,寻找更好、更复杂的映射方式到.
您可以考虑更改基本过程,例如使用决策树而不是线性函数。由于一棵树可能只是弱学习器,您可以将树组合(或集成)到随机森林。或者你更进一步并使用提升,在其中你重复使用残差中包含的信息来提高你的适合度。通常使用非常小的树来执行此操作,但您也可以提升线性回归。
这是 L2 提升的一个小例子:
library(glmnet)
# Simple boosting example from:
# P. Bühlmann, T. Hothorn (2007), "Boosting Algorithms: Regularization, Prediction and Model Fitting", Statistical Science 22(4), p. 477-505.
# L2-Boosting from Section 3.3 (p. 483)
#######################
# Data
x = matrix(c(130,165,150,150,140,198,307,350,318,304,302,429),nrow=6,ncol=2,byrow = TRUE)
y = c(18,15,18,16,17,15)
# Parameter
# This works like a learning rate
nu = 0.1
# Early stopping (SSR value to stop)
es = 7.58765583743327
# Max. iterations (of boosting)
maxiter = 10000
#######################
# OLS benchmark model
olsdata = data.frame(cbind(y,x))
ols = lm(y~.,data=olsdata)
olspreds = predict(ols,newdata=olsdata)
olsssr = sum((y-olspreds)^2)
print(paste0("OLS SSE: ",olsssr))
#######################
# Boosting
# Initialize f0
f0 = mean(y)
f0ssr = sum((y-f0)^2)
# Lists to store results per boosting iteration
ssrlist = list()
bstep = list()
# Boosting (p. 483, Sec. 3.3, L2-Boosting)
for (n in seq(1:maxiter)){
# I) Get residual
if(n==1){f=f0} # initialize in first step
u=y-f # get residual from estimation
# II) Fit residual / predict, I use ridge (alpha=0)
reg = glmnet(x,u,alpha=0, lambda=2)
g = predict(reg, newx=x, type="link")
# III) Update f
f=f+nu*g
# Print feedback
cat(paste0("Step: ", n," SSR: ", sum(u^2), "\n" ))
# Save SSR/iter to list
ssrlist[[n]] <- sum(u^2)
bstep[[n]] <- n
# Early stopping rule
if(sum(u^2)<es){break}
}
#######################
# End statement
cat("\n ~~~ RESULTS ~~~ \n")
cat(paste0("OLS SSR: ", olsssr, "\n"))
cat(paste0("Initialised SSR: ", f0ssr, "\n"))
cat(paste0("Last SSR boosting: ", ssrlist[length(ssrlist)], " [after ",bstep[length(bstep)], " iterations] \n"))
这里的问题是您不仅需要解决一个回归,而是 10000(在此处的示例中)。在现实世界的应用中,必须完成的数学运算量是巨大的(对于 boosting 和神经网络也是如此)。
那么什么是机器学习?您想让“机器学习事物”(识别数据中的模式、识别图像、基于此进行预测等),您可能无法使用笔和纸自己完成这项学习任务。随着时间的推移,计算能力的提高使我们能够解决非常复杂的问题。由于这种廉价的资源,新的工具和方法得以发展。你今天可以在笔记本电脑上做一些事情,这在 1990 年代后期似乎是不可能的。
当然,你需要告诉“机器”如何学习。这是很多统计数据,但也是计算机科学。例如,神经网络主要由计算机科学家推动。归根结底,这台机器只是一个工具,但却是一个非常有用的工具。
让我试着用一个例子来解释你,
假设我们有一个数据集,其中X1、X2和Y是目标值。现在在机器学习中,我们的目标是得到一个方程,该方程应该计算出与目标值接近的值。
考虑一个简单的方程,
f(X) = w1X1 + w2X2 + b
这里我们的目标是确定权重的最佳值,即w1 和 w2,使得 f(X) ~Y。
一般来说,最初 f(X) 给你一个非常不同的值(因为没有调整权重),但随着每次迭代(epoch),f(x) 会逐渐变得更好(调整权重),这就是所谓的“参数学习”。
机器学习是一个非常广阔的领域,每个人都会对你的问题有不同的答案。这是我的:在机器学习中,“学习”一词是指通过梯度下降(例如神经网络)或其他算法(EM 算法、K-Mean 聚类)迭代改进模型的过程。
例如,假设您想识别狗/猫的图像。在梯度下降期间,您将调整模型系数以减少损失,这将导致更好的图像分类。换句话说,你学会了区分狗和猫。
我想你的问题是:在背景偏好“机器学习和统计建模之间的区别”中,“学习”的含义是什么。
似乎仍然有必要让我们清楚地定义一切。但是这里的“学习”这个词并不是关于主观能动性的。
系统偏好对于您的问题的答案非常重要,就像指定任务的算法或策略一样。
在这种情况下,学习意味着该算法有可能基于相同的数据集和过去的经验不断地加速其性能(无需更改算法,忘记与参数有关的容量上限),这就是机器学习和机器学习的区别。和传统的统计建模算法。