Kernel是机器学习中的一个关键组件,其作用类似于一个"解谜者",通过巧妙的数学运算揭示数据中的潜在结构。就像三棱镜可以分离出光谱中的各种颜色一样,Kernel能够将数据中的复杂信息进行拆解和映射,从而为算法提供更多的认知维度。
核函数的工作方式与三棱镜的分光原理有着相似之处。三棱镜通过折射和反射将入射光分解成不同波长的光谱,而核函数通过数学变换将原始数据映射到高维空间,揭示出在低维度中难以察觉的特征。这种映射过程有助于算法更好地理解数据的复杂性和内在关系。
与实验室中使用不同类型的光学元件来实现不同实验目的一样,机器学习中也存在多种核函数可供选择。例如,线性核函数、多项式核函数和高斯核函数等,它们各自具有特定的数学形式和适用范围。选择合适的核函数是机器学习中一个关键的决策,直接影响算法的性能和对数据的理解能力。
Kernel在支持向量机(SVM)等算法中得到广泛应用。通过在输入数据上应用核函数,这些算法可以更灵活地处理非线性关系,并提高对复杂数据结构的建模能力。这使得Kernel成为处理实际问题中高度非线性数据的有力工具。
1、SVM中的例子
Kernel 在我的知识中,最早是在 SVM 中开始被使用的。
举个 SVM 的例子,在下面的数据中分别使用了线性 SVN
与带 RBF(Radial Basis Function) 核的 SVF,你可以很容易看出 Kernel 是带 RBF 的略好一些,因为在线性空间不容易处理的问题,在高维空间可能就是存在一个很方便的解。
它很简单,但是能明显的看到应用kernel 函数把数据映射到高维空间后,更有可能找到一个超平面,来把数据分割开。
2、PCA 算法中的 Kernel 应用
做为前机器学习时代的主力算法,PCA 是大家所熟知的。
看看下面的例子吧。一个三维空间的数据是很难做分类的,但是靠个rbf核
降维到二维空间,是不是感觉能动手了?
3、CNN领域的Kernel
其实Kernel这东西在CNN里也是有极多应用的。或者说CNN的核心就是一个小结构Kernel, 一个大结构整个Layers间加了个残差连接Q或者做个UNet结构°。
CNN的Kernel是直接景影响整个网络的性能的。如果用可视化来看,Kernel正是一个标准的操 作,把原始数据Q映射到不同的数据空间,类似于一个Filter的概念,它会分别提取边缘、纹理等 特征,再做了最后的判断。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
#创建一个简单的示例图像
image np.array([[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,28],
[21,22,23,24,25])
#创建一个简单的卷积核Q
kernel np.array([[1,0,-1],
[1,0,-1],
[1,9,-1])
#使用2D卷积(无填充,步长为1)
output signal.convolve2d(image,kernel,mode='valid')
#可视化原始图像、卷积核和卷积结果
fig,axarr plt.subplots(1,3,figsize=(15,5))
axarr[e].imshow(image,cmap='gray')
axarr[0].set_title('Original Image')
axarr[0].set_axis_off()
axarr[1].imshow(kernel,cmap='gray')
axarr[1].set_title('Kernel')
axarr[1].set_axis_off()
axarr[2].imshow(output,cmap='gray'
axarr[2].set_title('Convolution Result')
axarr[2].set_axis_off()
plt.show()
4、 Transformer的Kernel
在Transformer里,它是没有唯一的一个类似CNN的Kernel的,它的结构最像Kenel功能的应该是QKV的三个权重与FeedForward这个权重,只不过这个Kernel为了兼容数据的位置信息,把窗口做成了全输入这么大,也就是每个Kernel都是一个全尺寸的。