本文目录
一、机器学习中有哪些重要的优化算法
梯度下降是非常常用的优化算法。作为机器学习的基础知识,这是一个必须要掌握的算法。借助本文,让我们来一起详细了解一下这个算法。
前言
本文的代码可以到我的Github上获取:
本文的算法示例通过Python语言实现,在实现中使用到了numpy和matplotlib。如果你不熟悉这两个工具,请自行在网上搜索教程。
关于优化
大多数学习算法都涉及某种形式的优化。优化指的是改变x以最小化或者最大化某个函数的任务。
我们通常以最小化指代大多数最优化问题。最大化可经由最小化来实现。
我们把要最小化或最大化的函数成为目标函数(objective function)或准则(criterion)。
我们通常使用一个上标*表示最小化或最大化函数的x值,记做这样:
[x^*= arg; min; f(x)]
优化本身是一个非常大的话题。如果有兴趣,可以通过《数值优化》和《运筹学》的书籍进行学习。
模型与假设函数
所有的模型都是错误的,但其中有些是有用的。– George Edward Pelham Box
模型是我们对要分析的数据的一种假设,它是为解决某个具体问题从数据中学习到的,因此它是机器学习最核心的概念。
针对一个问题,通常有大量的模型可以选择。
本文不会深入讨论这方面的内容,关于各种模型请参阅机器学习的相关书籍。本文仅以最简单的线性模型为基础来讨论梯度下降算法。
这里我们先介绍一下在监督学习(supervised learning)中常见的三个符号:
m,描述训练样本的数量
x,描述输入变量或特征
y,描述输出变量或者叫目标值
请注意,一个样本可能有很多的特征,因此x和y通常是一个向量。不过在刚开始学习的时候,为了便于理解,你可以暂时理解为这就是一个具体的数值。训练集会包含很多的样本,我们用表示其中第i个样本。
x是数据样本的特征,y是其目标值。例如,在预测房价的模型中,x是房子的各种信息,例如:面积,楼层,位置等等,y是房子的价格。在图像识别的任务中,x是图形的所有像素点数据,y是图像中包含的目标对象。
我们是希望寻找一个函数,将x映射到y,这个函数要足够的好,以至于能够预测对应的y。由于历史原因,这个函数叫做假设函数(hypothesis function)。
学习的过程如下图所示。即:首先根据已有的数据(称之为训练集)训练我们的算法模型,然后根据模型的假设函数来进行新数据的预测。
线性模型(linear model)正如其名称那样:是希望通过一个直线的形式来描述模式。线性模型的假设函数如下所示:
[h_{\theta}(x)= \theta_{0}+ \theta_{1}* x]
这个公式对于大家来说应该都是非常简单的。如果把它绘制出来,其实就是一条直线。
下图是一个具体的例子,即:的图形:
在实际的机器学习工程中,你会拥有大量的数据。这些数据会来自于某个数据源。它们存储在csv文件中,或者以其他的形式打包。
但是本文作为演示使用,我们通过一些简单的代码自动生成了需要的数据。为了便于计算,演示的数据量也很小。
import numpy as np
max_x= 10
data_size= 10
theta_0= 5
theta_1= 2
def get_data:
x= np.linspace(1, max_x, data_size)
noise= np.random.normal(0, 0.2, len(x))
y= theta_0+ theta_1* x+ noise
return x, y
这段代码很简单,我们生成了x范围是 [1, 10]整数的10条数据。对应的y是以线性模型的形式计算得到,其函数是:。现实中的数据常常受到各种因素的干扰,所以对于y我们故意加上了一些高斯噪声。因此最终的y值为比原先会有轻微的偏离。
最后我们的数据如下所示:
x= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y= [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我们可以把这10条数据绘制出来这样就有一个直观的了解了,如下图所示:
虽然演示用的数据是我们通过公式计算得到的。但在实际的工程中,模型的参数是需要我们通过数据学习到的。所以下文我们假设我们不知道这里线性模式的两个参数是什么,而是通过算法的形式求得。
最后再跟已知的参数进行对比以验证我们的算法是否正确。
有了上面的数据,我们可以尝试画一条直线来描述我们的模型。
例如,像下面这样画一条水平的直线:
很显然,这条水平线离数据太远了,非常的不匹配。
那我们可以再画一条斜线。
我们初次画的斜线可能也不贴切,它可能像下面这样:
最后我们通过不断尝试,找到了最终最合适的那条,如下所示:
梯度下降算法的计算过程,就和这种本能式的试探是类似的,它就是不停的迭代,一步步的接近最终的结果。
代价函数
上面我们尝试了几次通过一条直线来拟合(fitting)已有的数据。
二维平面上的一条直线可以通过两个参数唯一的确定,两个参数的确定也即模型的确定。那如何描述模型与数据的拟合程度呢?答案就是代价函数。
代价函数(cost function)描述了学习到的模型与实际结果的偏差程度。以上面的三幅图为例,最后一幅图中的红线相比第一条水平的绿线,其偏离程度(代价)应该是更小的。
很显然,我们希望我们的假设函数与数据尽可能的贴近,也就是说:希望代价函数的结果尽可能的小。这就涉及到结果的优化,而梯度下降就是寻找最小值的方法之一。
代价函数也叫损失函数。对于每一个样本,假设函数会依据计算出一个估算值,我们常常用来表示。即。
很自然的,我们会想到,通过下面这个公式来描述我们的模型与实际值的偏差程度:
[(h_\theta(x^i)- y^i)^2=(\widehat{y}^{i}- y^i)^2=(\theta_{0}+ \theta_{1}* x^{i}- y^{i})^2]
请注意,是实际数据的值,是我们的模型的估算值。前者对应了上图中的离散点的y坐标,后者对应了离散点在直线上投影点的y坐标。
每一条数据都会存在一个偏差值,而代价函数就是对所有样本的偏差求平均值,其计算公式如下所示:
[L(\theta)= \frac{1}{m} \sum_{i=1}^{m}(h_\theta(x^i)- y^i)^2= \frac{1}{m} \sum_{i=1}^{m}(\theta_{0}+ \theta_{1}* x^{i}- y^{i})^2]
当损失函数的结果越小,则意味着通过我们的假设函数估算出的结果与真实值越接近。这也就是为什么我们要最小化损失函数的原因。
不同的模型可能会用不同的损失函数。例如,logistic回归的假设函数是这样的:。其代价函数是这样的:借助上面这个公式,我们可以写一个函数来实现代价函数:
def cost_function(x, y, t0, t1):
cost_sum= 0
for i in range(len(x)):
cost_item= np.power(t0+ t1* x[i]- y[i], 2)
cost_sum+= cost_item
return cost_sum/ len(x)
这个函数的代码应该不用多做解释,它就是根据上面的完成计算。
我们可以尝试选取不同的和组合来计算代价函数的值,然后将结果绘制出来:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0= 5
theta_1= 2
def draw_cost(x, y):
fig= plt.figure(figsize=(10, 8))
ax= fig.gca(projection='3d')
scatter_count= 100
radius= 1
t0_range= np.linspace(theta_0- radius, theta_0+ radius, scatter_count)
t1_range= np.linspace(theta_1- radius, theta_1+ radius, scatter_count)
cost= np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b]= cost_function(x, y, t0_range[a], t1_range[b])
t0, t1= np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在这段代码中,我们对和各自指定了一个范围进行100次的采样,然后以不同的组合对来计算代价函数的值。
如果我们将所有点的代价函数值绘制出来,其结果如下图所示:
从这个图形中我们可以看出,当越接近 [5, 2]时其结果(偏差)越小。相反,离得越远,结果越大。
直观解释
从上面这幅图中我们可以看出,代价函数在不同的位置结果大小不同。
从三维的角度来看,这就和地面的高低起伏一样。最高的地方就好像是山顶。
而我们的目标就是:从任意一点作为起点,能够快速寻找到一条路径并以此到达图形最低点(代价值最小)的位置。
而梯度下降的算法过程就和我们从山顶想要快速下山的做法是一样的。
在生活中,我们很自然会想到沿着最陡峭的路往下行是下山速度最快的。如下面这幅图所示:
针对这幅图,细心的读者可能很快就会有很多的疑问,例如:
对于一个函数,怎么确定下行的方向?
每一步该往前走多远?
有没有可能停留在半山腰的平台上?
这些问题也就是本文接下来要讨论的内容。
算法描述
梯度下降算法最开始的一点就是需要确定下降的方向,即:梯度。
我们常常用来表示梯度。
对于一个二维空间的曲线来说,梯度就是其切线的方向。如下图所示:
而对于更高维空间的函数来说,梯度由所有变量的偏导数决定。
其表达式如下所示:
[\nabla f({\theta})=( \frac{\partial f({\theta})}{\partial \theta_1}, \frac{\partial f({\theta})}{\partial \theta_2},..., \frac{\partial f({\theta})}{\partial \theta_n})]
在机器学习中,我们主要是用梯度下降算法来最小化代价函数,记做:
[\theta ^*= arg min L(\theta)]
其中,L是代价函数,是参数。
梯度下降算法的主体逻辑很简单,就是沿着梯度的方向一直下降,直到参数收敛为止。
记做:
[\theta ^{k+ 1}_i= \theta^{k}_i- \lambda \nabla f(\theta^{k})]
这里的下标i表示第i个参数。上标k指的是第k步的计算结果,而非k次方。在能够理解的基础上,下文的公式中将省略上标k。这里有几点需要说明:
收敛是指函数的变化率很小。具体选择多少合适需要根据具体的项目来确定。在演示项目中我们可以选择0.01或者0.001这样的值。不同的值将影响算法的迭代次数,因为在梯度下降的最后,我们会越来越接近平坦的地方,这个时候函数的变化率也越来越小。如果选择一个很小的值,将可能导致算法迭代次数暴增。
公式中的称作步长,也称作学习率(learning rate)。它决定了每一步往前走多远,关于这个值我们会在下文中详细讲解。你可以暂时人为它是一个类似0.01或0.001的固定值。
在具体的项目,我们不会让算法无休止的运行下去,所以通常会设置一个迭代次数的最大上限。
线性回归的梯度下降
有了上面的知识,我们可以回到线性模型代价函数的梯度下降算法实现了。
首先,根据代价函数我们可以得到梯度向量如下:
[\nabla f({\theta})=(\frac{\partial L(\theta)}{ \partial\theta_{0}}, \frac{ \partial L(\theta)}{ \partial\theta_{1}})=(\frac{2}{m} \sum_{i=1}^{m}(\theta_{0}+ \theta_{1}* x^{i}- y^{i}), \frac{2}{m} \sum_{i=1}^{m}(\theta_{0}+ \theta_{1}* x^{i}- y^{i}) x^{i})]
接着,将每个偏导数带入迭代的公式中,得到:
[\theta_{0}:= \theta_{0}- \lambda \frac{\partial L(\theta_{0})}{ \partial\theta_{0}}= \theta_{0}- \frac{2 \lambda}{m} \sum_{i=1}^{m}(\theta_{0}+ \theta_{1}* x^{i}- y^{i}) \ \theta_{1}:= \theta_{1}- \lambda \frac{\partial L(\theta_{1})}{ \partial\theta_{1}}= \theta_{1}- \frac{2 \lambda}{m} \sum_{i=1}^{m}(\theta_{0}+ \theta_{1}* x^{i}- y^{i}) x^{i}]
由此就可以通过代码实现我们的梯度下降算法了,算法逻辑并不复杂:
learning_rate= 0.01
def gradient_descent(x, y):
t0= 10
t1= 10
delta= 0.001
for times in range(1000):
sum1= 0
sum2= 0
for i in range(len(x)):
sum1+=(t0+ t1* x[i]- y[i])
sum2+=(t0+ t1* x[i]- y[i])* x[i]
t0_= t0- 2* learning_rate* sum1/ len(x)
t1_= t1- 2* learning_rate* sum2/ len(x)
print('Times:{}, gradient: [{},{}]'.format(times, t0_, t1_))
if(abs(t0- t0_)< delta and abs(t1- t1_)< delta):
print('Gradient descent finish')
return t0_, t1_
t0= t0_
t1= t1_
print('Gradient descent too many times')
return t0, t1
这段代码说明如下:
我们随机选择了都为10作为起点
设置最多迭代1000次
收敛的范围设为0.001
学习步长设为0.01
如果我们将算法迭代过程中求得的线性模式绘制出来,可以得到下面这幅动态图:
最后算法得到的结果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
从输出中可以看出,算法迭代了660次就收敛了。这时的结果[5.193562479839619, 1.9533620008416623],这已经比较接近目标值 [5, 2]了。如果需要更高的精度,可以将delta的值调的更小,当然,此时会需要更多的迭代次数。
高维扩展
虽然我们举的例子是二维的,但是对于更高维的情况也是类似的。同样是根据迭代的公式进行运算即可:
[\theta_{i}= \theta_{i}- \lambda \frac{\partial L(\theta)}{\partial \theta_i}= \theta_{i}- \frac{2\lambda}{m} \sum_{i=1}^{m}(h_\theta(x^{k})-y^k)x_i^k]
这里的下标i表示第i个参数,上标k表示第k个数据。
梯度下降家族BGD
在上面的内容中我们看到,算法的每一次迭代都需要把所有样本进行遍历处理。这种做法称为之Batch Gradient Descent,简称BGD。作为演示示例只有10条数据,这是没有问题的。
但在实际的项目中,数据集的数量可能是几百万几千万条,这时候每一步迭代的计算量就会非常的大了。
于是就有了下面两个变种。
SGD
Stochastic Gradient Descent,简称SGD,这种算法是每次从样本集中仅仅选择一个样本来进行计算。很显然,这样做算法在每一步的计算量一下就少了很多。
其算法公式如下:
[\theta_{i}= \theta_{i}- \lambda \frac{\partial L(\theta)}{\partial \theta_i}= \theta_{i}- \lambda(h_\theta(x^k)-y^k)x_i^k]
当然,减少算法计算量也是有代价的,那就是:算法结果会强依赖于随机取到的数据情况,这可能会导致算法的最终结果不太令人满意。
MBGD
以上两种做法其实是两个极端,一个是每次用到了所有数据,另一个是每次只用一个数据。
我们自然就会想到两者取其中的方法:每次选择一小部分数据进行迭代。这样既避免了数据集过大导致每次迭代计算量过大的问题,也避免了单个数据对算法的影响。
这种算法称之为Mini-batch Gradient Descent,简称MBGD。
其算法公式如下:
[\theta_{i}= \theta_{i}- \lambda \frac{\partial L(\theta)}{\partial \theta_i}= \theta_{i}- \frac{2\lambda}{m} \sum_{i=a}^{a+ b}(h_\theta(x^k)-y^k)x_i^k]
当然,我们可以认为SGD是Mini-batch为1的特例。
针对上面提到的算法变种,该如何选择呢?
下面是Andrew Ng给出的建议:
如果样本数量较小(例如小于等于2000),选择BGD即可。
如果样本数量很大,选择来进行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning中对三种算法的对比
方法准确性更新速度内存占用在线学习BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
算法优化
式7是算法的基本形式,在这个基础上有很多人进行了更多的研究。接下来我们介绍几种梯度下降算法的优化方法。
Momentum
Momentum是动量的意思。这个算法的思想就是借助了动力学的模型:每次算法的迭代会使用到上一次的速度作为依据。
算法的公式如下:
[v^t= \gamma v^{t- 1}+ \lambda \nabla f(\theta) \ \theta= \theta- v_t]
对比式7可以看出,这个算法的主要区别就是引入了,并且,每个时刻的受前一个时刻的影响。
从形式上看,动量算法引入了变量 v充当速度角色——它代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。名称动量来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。动量在物理学上定义为质量乘以速度。在动量学习算法中,我们假设是单位质量,因此速度向量 v也可以看作是粒子的动量。
对于可以取值0,而是一个常量,设为0.9是一个比较好的选择。
下图是momentum算法的效果对比:
对原来的算法稍加修改就可以增加动量效果:
def gradient_descent_with_momentum(x, y):
t0= 10
t1= 10
delta= 0.001
v0= 0
v1= 0
gamma= 0.9
for times in range(1000):
sum1= 0
sum2= 0
for i in range(len(x)):
sum1+=(t0+ t1* x[i]- y[i])
sum2+=(t0+ t1* x[i]- y[i])* x[i]
v0= gamma* v0+ 2* learning_rate* sum1/ len(x)
v1= gamma* v1+ 2* learning_rate* sum2/ len(x)
t0_= t0- v0
t1_= t1- v1
print('Times:{}, gradient: [{},{}]'.format(times, t0_, t1_))
if(abs(t0- t0_)< delta and abs(t1- t1_)< delta):
print('Gradient descent finish')
return t0_, t1_
t0= t0_
t1= t1_
print('Gradient descent too many times')
return t0, t1
以下是该算法的输出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
从结果可以看出,改进的算法只用了129次迭代就收敛了。速度比原来660次快了很多。
同样的,我们可以把算法计算的过程做成动态图:
对比原始的算法过程可以看出,改进算法最大的区别是:在寻找目标值时会在最终结果上下跳动,但是越往后跳动的幅度越小,这也就是动量所产生的效果。
Learning Rate优化
至此,你可能还是好奇该如何设定学习率的值。
事实上,这个值的选取需要一定的经验或者反复尝试才能确定。
《深度学习》一书中是这样描述的:“与其说是科学,这更像是一门艺术,我们应该谨慎地参考关于这个问题的大部分指导。”。关键在于,这个值的选取不能过大也不能过小。
如果这个值过小,会导致每一次迭代的步长很小,其结果就是算法需要迭代非常多的次数。
那么,如果这个值过大会怎么样呢?其结果就是:算法可能在结果的周围来回震荡,却落不到目标的点上。下面这幅图描述了这个现象:
事实上,学习率的取值未必一定要是一个常数,关于这个值的设定有很多的研究。
下面是比较常见的一些改进算法。
AdaGrad
AdaGrad是Adaptive Gradient的简写,该算法会为每个参数设定不同的学习率。它使用历史梯度的平方和作为基础来进行计算。
其算法公式如下:
[\theta_i= \theta_i- \frac{\lambda}{\sqrt{G_t+ \epsilon}} \nabla f(\theta)]
对比式7,这里的改动就在于分号下面的根号。
根号中有两个符号,第二个符号比较好理解,它就是为了避免除0而人为引入的一个很小的常数,例如可以设为:0.001。
第一个符号的表达式展开如下:
[G_t= \sum_{i= 1}^{t} \nabla f(\theta){i}\nabla f(\theta){i}^{T}]
这个值其实是历史中每次梯度的平方的累加和。
AdaGrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的学习率;相反,对于出现频率较高的参数采用较小的学习率。因此,Adagrad非常适合处理稀疏数据。
但该算法的缺点是它可能导致学习率非常小以至于算法收敛非常的慢。
关于这个算法的直观解释可以看李宏毅教授的视频课程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的简写。RMSProp是AI教父Geoff Hinton提出的一种自适应学习率方法。AdaGrad会累加之前所有的梯度平方,而RMSProp仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
该算法的公式如下:
[E[\nabla f(\theta_{i})^2]^{t}= \gamma E[\nabla f(\theta_{i})^2]^{t- 1}+(1-\gamma)(\nabla f(\theta_{i})^{t})^{2} \ \theta_i= \theta_i- \frac{\lambda}{\sqrt{E[g^2]^{t+1}+ \epsilon}} \nabla f(\theta_{i})]
类似的,是为了避免除0而引入。是衰退参数,通常设为0.9。
这里的是t时刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的简写。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
该算法公式如下:
[m^{t}= \beta_{1} m^{t-1}+(1-\beta_{1}) \nabla f(\theta) \ v^{t}= \beta_{2} v^{t-1}+(1-\beta_{2}) \nabla f(\theta)^2 \ \widehat{m}^{t}= \frac{m^{t}}{1- \beta^{t}_1} \ \widehat{v}^{t}= \frac{v^{t}}{1- \beta^{t}_2} \ \theta= \theta- \frac{\lambda}{\sqrt{\widehat{v}^{t}}+ \epsilon}\widehat{m}^{t}]
,分别是对梯度的一阶矩估计和二阶矩估计。,是对,的校正,这样可以近似为对期望的无偏估计。
Adam算法的提出者建议默认值为0.9,默认值为0.999,默认值为。
在实际应用中,Adam较为常用,它可以比较快地得到一个预估结果。
优化小结
这里我们列举了几种优化算法。它们很难说哪种最好,不同的算法适合于不同的场景。在实际的工程中,可能需要逐个尝试一下才能确定选择哪一个,这个过程也是目前现阶段AI项目要经历的工序之一。
实际上,该方面的研究远不止于此,如果有兴趣,可以继续阅读《Sebastian Ruder: An overview of gradient descent optimization algorithms》这篇论文或者 Optimization for Deep Learning这个Slides进行更多的研究。
由于篇幅所限,这里不再继续展开了。
算法限制
梯度下降算法存在一定的限制。首先,它要求函数必须是可微分的,对于不可微的函数,无法使用这种方法。
除此之外,在某些情况下,使用梯度下降算法在接近极值点的时候可能收敛速度很慢,或者产生Z字形的震荡。这一点需要通过调整学习率来回避。
另外,梯度下降还会遇到下面两类问题。
局部最小值
局部最小值(Local Minima)指的是,我们找到的最小值仅仅是一个区域内的最小值,而并非全局的。由于算法的起点是随意取的,以下面这个图形为例,我们很容易落到局部最小值的点里面。
这就是好像你从上顶往下走,你第一次走到的平台未必是山脚,它有可能只是半山腰的一个平台的而已。
算法的起点决定了算法收敛的速度以及是否会落到局部最小值上。
坏消息是,目前似乎没有特别好的方法来确定选取那个点作为起点是比较好的,这就有一点看运气的成分了。多次尝试不同的随机点或许是一个比较好的方法,这也就是为什么做算法的优化这项工作是特别消耗时间的了。
但好消息是:
对于凸函数或者凹函数来说,不存在局部极值的问题。其局部极值一定是全局极值。
最近的一些研究表明,某些局部极值并没有想象中的那么糟糕,它们已经非常的接近全局极值所带来的结果了。
鞍点
除了Local Minima,在梯度下降的过程中,还有可能遇到另外一种情况,即:鞍点(Saddle Point)。鞍点指的是我们找到点某个点确实是梯度为0,但它却不是函数的极值,它的周围既有比它小的值,也有比它大的值。这就好像马鞍一样。
如下图所示:
多类随机函数表现出以下性质:在低维空间中,局部极值很普遍。但在高维空间中,局部极值比较少见,而鞍点则很常见。
不过对于鞍点,可以通过数学方法Hessian矩阵来确定。关于这点,这里就不再展开了,有兴趣的读者可以以这里提供的几个链接继续探索。
参考资料与推荐读物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吴恩达:机器学习
吴恩达:深度学习
Peter Flach:机器学习
李宏毅- ML Lecture 3-1: Gradient Descent
PDF:李宏毅- Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent– Mini-batch and more
刘建平Pinard-梯度下降(Gradient Descent)小结
多元函数的偏导数、方向导数、梯度以及微分之间的关系思考
[Machine Learning]梯度下降法的三种形式BGD、SGD以及MBGD
作者:阿Paul
二、地质工作体制、机制的基本概念和类型
一、体制和机制
《辞海》对“体制”的解释是:国家机关、企事业单位在机构设置、领导隶属关系和管理权限划分等方面的体系、制度、方法、形式等的总称。可见,体制是由规则和机构组成的。
机制,最初出自希腊文mechane,指机器的构造与运转原理,即机器的各个零件、部件之间的相互联系及其运转的方式。之后被广泛应用到社会、经济各个领域,泛指事物之间的相互关系及其运行方式等。比如经济机制,是指社会经济总体中各部分、各个经济主体之间的相互联系和相互作用的制约关系,它包括经济运行的方法、手段、环节的总和;又如价格、利率、信贷、货币、税收、工资等都是一种机制。机制有三个特点:一是客观性,它反映社会、经济运行中规律性的东西;二是自主变化性,这些手段和环节,可以在外界变化中自动地进行调节,变化,以适应外界的环境;三是动态性,反映机制的方法、手段不是静止的,而是在动态中表现出来的。
二、地质工作体制和地质工作机制
(一)一般意义上的地质工作体制机制
地质工作体制,是确保其管理过程得以顺利实施的物质载体,也是支撑地质工作管理系统的骨架支柱。从体制一般概念的理解,应该是指地质工作管理机构的设置、地位、职责和内部权责关系及与其相关的规章制度的总和。可见,地质工作体制是一个综合性的概念,从不同角度有不同的划分标准,一般包括地质工作管理机构及其职能体制、领导体制、层级管理体制等内容。其核心是各机构间的职、权、责的配置问题。具体讲,则包括地质工作规划、生产、管理等机构的行政领导体制;地质工作管理系统内各机构职能及权责关系;地质工作管理体制中中央、地方两级管理体制;地质工作管理系统中政府、事业单位及企业单位之间的关系等。
机制应用在地质工作中,指的是在地质工作体制框架内,能使地质工作正常、健康有序运行的方法、手段、环节的总和。如地质工作经济运行机制,反映的就是地质工作投入产出之间的关系;地质工作项目机制,主要反映项目的运作方式。
(二)从经济管理体制机制角度对地质工作体制机制的解释
地质工作属于经济工作,因而地质工作的体制和机制,属于经济管理体制的范畴。根据刘明勇主编的《经济工作实用词解》:“经济管理体制是指对社会再生产总过程进行决策、计划、组织、监督和调节制度的完善体系,是经济生活的管理组织、制度、关系、方法规范化的总称,是社会制度的反映,是生产力和生产关系状况的体现,是社会经济运行方式和调节制度的概括。它一般包括如下内容:①动力结构,即社会经济运行的推动力的形成和发挥。②控制结构,即社会经济运行方式的决策及其实现方式。③调节结构,即社会经济运行的调节及其方式。④信息结构,即社会经济信息的总量、质量及其传递与处理方式。⑤组织结构,即各级各类管理组织的形成、存在与发挥作用的形成及其相互间的关系。⑥所有制结构,即社会生产要素占有主体的构成状态及其对生产要素的支配、使用方式和状况。”
根据上述基本概念,可以把地质工作的体制作如下理解:
1.地质工作的动力结构
从我国地质工作当前的现状来看,推动地质工作的动力主要有两大来源,一个是各级政府的行政权力;另一个是企业、单位的经济利益。但是每一个动力都不是单独存在的,还可能有其他因素参与其中。至于这些动力是怎么形成的,既有各自本能的要求,也有社会经济形势发展所产生的影响所致。比如各级政府的“地质勘查基金”,开始是出于对商业性地质工作的支持,减轻其风险,后来在矿产品大幅涨价、导致矿业权涨价,而形成的经济利益的引导,构成了复杂的动力结构。
2.地质工作的控制结构
地质工作的控制结构主要是指为了实现什么样的决策目标来开展地质工作,以及用什么方式来实现这个目标。如果是政府的行政权力推动地质工作,那么它必然是为实现政府的行政职能及追求政府要达到的目标,如政府的发展规划所需要的资源潜力,即摸清资源家底,以及政府要实现GDP的发展指标,扩大招商引资等;如果是企业、单位的资本权益推动地质工作,那么它必然是为实现自己的发展战略,以及要达到自己的经营收入目标和利润目标等。所以控制结构对地质工作来说,是更深层次的目标所要达到的追求。因此,为了实现这些追求,会采取权力范围内所允许的一切方式加以推进。
3.地质工作的调节结构
地质工作的调节结构主要是指地质工作为达到预定目标,在推进过程中用什么方式加以调节。如果政府自己是出资主体,它完全可以用行政权力、指令性计划来调节地质工作;如果企业是出资主体,企业也会用自己资本的权力、自己的计划来调节地质工作。当企业的计划不能适应政府的规划时,政府则可以通过行政的、法律的和经济的手段加以调节,这些手段包括行政批准,财政支持,税收增减,信用支持,货币政策,汇率政策等。
4.地质工作的信息结构
地质工作的信息结构主要是指用什么信息指标传递、反映地质工作运行,包括数量指标,质量指标。我国当前反映地质工作运行的指标多为实物形态,如地质项目、地质工作投入、地质工作实物工作量、各种类型的地质报告、各种级别的矿产资源储量和矿产勘查产地、矿点,以及地质报告的提交、利用状况指标等。在市场经济体制下,还应当强化地质工作运行经济效益指标,如地质工作的投资、成本及其产出的回报。
5.地质工作的组织结构
地质工作的组织结构主要是指用什么样的组织机构去保证地质工作的正常运行。在计划经济体制下,由于是国家用行政权力统一组织实施地质工作,所以固体矿产勘查组织形式是国家一级的行政事业单位,在纵向上实行三级管理,即部委一级、厅局一级、大队一级;油气勘查是探采结合的,纵向上也大致是三级管理。在社会主义市场经济体制下,探采分离的地质机构大致还保持,但是运行的经济关系发生了重大变化,除公益性地质工作还沿用原来的事业管理方式外,其余的地勘单位虽然还保有原来的事业外壳,但大多已经面向市场,从横向上取得收入,维持运行。与此同时,大多数矿山企业已经不能无偿取得地质成果,他们也开始从事地质工作或者通过市场购买地质成果,致使地质工作的组织结构发生了根本变化。
6.地质工作的所有制结构
地质工作的所有制结构主要是指从事地质工作的单位或企业,是由谁出资主办的。这个出资主办同地质工作的出资是两回事。前者指从事地质调查的机构由谁拿钱办起来的;后者是指地质工作项目,是由谁投入的资金开展地质工作。在我国,原来的地勘单位都是国家出资开办的,都是国家所有制;新组建的地勘单位,其所有制结构则是多元的,有的是国家独资的,有的是股份制,也有民营的。
经济机制主要是指经济运行机制。对地质工作来说,就是地质工作在运行中的内在机能和固有运转方式,实际上也是一个循环过程。从纵向上说,这种循环包括从地质立项开始,到项目的批准、组织实施(即人、财、物的投入及其转换)、提交地质报告(地质成果)、地质报告被利用(相当于销售收入),再立新的地质项目,周而复始。在整个运作过程中,各个环节必须相互配合,相互促进,相互制约,这就是机制。从横向上说,地质工作在纵向运行中,在内部和外部,必须同时有多个部门、多个单位的相互配合、相互促进、相互制约,这也是机制。所以经济机制实际是无时不在、无处不在的。以独立的地质勘查生产为例,它的经营机制主要包括四个方面:一是动力机制。地勘单位作为一个独立或相对独立的经济实体,它的生产经营活动必须是持续进行,不能中断。这种持续就是活力,就是生机;而活力和生机,必须有动力推动,这种动力又是产生于对现实目标的追求。不管这个目标是为经济利益服务,还是为行政权力服务,它都构成了这个地勘单位的动力机能。二是吸收、应用和发展技术的机能。一个具有独立利益的经济实体,在自身动力机能的驱使下,它会追求自己的效益,以较少的投入,获得尽可能多的产出。为此,它会主动地研究新技术、新方法,应用新技术、新方法,提高劳动力能力,强化生产经营管理,求得新发展,从而产生一种追求技术进步的机能。三是自我制约机能。一个具有独立利益的经济实体,在正常运作中,必然会遵守政府法规、政策、社会道德规范,以及在经济活动方面,符合市场需要和自身发展需要。前者是为了维护自身正常利益所必需,否则就要受到惩罚;后者则是为了自己的生存和发展。这就是它本能产生出的自我约束机能。四是自我调节机能。一个具有独立的经济实体,在强大的经济或行政动因推动下,必然产生一种自我调节的机能,以便理顺内部和外部的各种关系,健全自身的整体功能。这些关系的调节包括:内部组织结构的调节,经济利益关系的调节,各个生产环节的调节,成果提交和服务的调节,对外公共关系的调节等。上述四种技能不是简单的叠加,而是相互有机地联系在一起,形成一种不断循环和发展的经济机制。
三、地质工作体制、机制分类
从经济管理体制、机制角度分类,地质工作的体制和机制可以有四种:计划调节的地质工作体制和机制;市场调节的地质工作体制和机制;以计划为主、市场为辅的地质工作体制和机制;以市场为主,辅之以必要的宏观调控的地质工作体制和机制。
(一)计划调节的地质工作体制、机制
计划调节是指国家政权或经济组织,对社会经济运行实行自觉的有意识的组织领导,是一种组织和管理经济的形式,并不是专指社会主义的计划经济。新中国成立以后,借鉴苏联的经验,实行了计划经济管理体制。当时地质工作作为国民经济的组成部分,当然也不能例外。
计划调节具体是指,国家宏观决策者从社会总体利益出发,依据客观经济规律,有计划地按照社会的需要,将社会总劳动时间,按比例分配于不同部门,实行资源的计划配置,以求国民经济按比例发展。它的基本功能是:调节经济总量,力求使其平衡;集中地调整重大产业结构,强力发展支柱产业;保证经济发展和生态环境的平衡,解决外部的经济问题;保护公平的经济行为,调节社会分配不公等。这种体制和机制,在地质工作中表现为:把整个社会当成一个大的经济体,从社会总收入(财政)拿出资金,开展地质工作,取得地质成果,无偿地向社会提供。社会在使用地质成果之后所产生的效益,再以向财政上缴利润的形式,返还给社会,形成一个大的循环。其优点是:①能够集中全国的人力、财力、物力,办几件大事,行动迅速,效果明显。如新中国成立初期,百业待兴,但必然首先解决物质基础问题。而在整个物质基础中,矿产资源占70%以上;要解决矿产资源、开采矿产品,就要首先找到矿产资源。这就要集中力量,加强地质工作。正是这种计划调节体制,才使我国很快发现了很多矿产地,随之迅速建立起矿山企业,保证了国民经济的快速发展。②能够在一个部门、一个地区很快取得突破,加快一些产业、一些地区的发展。这种情况,在2003年以后,发生在新疆、内蒙古等地区,效果明显。他们由地区财政、市县财政拿出专项资金,直接投到地质找矿上,很快摸清了家底,对外招商引资。它在矿产品大幅涨价的情况下,迅速增加了地区的经济实力。③能为地质找矿、矿产开发的社会环境方面,提供良好的条件。这种找矿体制和机制,由于行政主导,对地质工作运作中出现的多种利益冲突,可以通过当地政府出面调解,保证经济活动正常运行,减少内耗。
但是,这种体制和机制也存在严重的弊端:①计划是主观的东西,用行政方法确定的地质项目,完成之后很可能不是实际所需要的,造成所投资金长期积压;同时一些急需的地质成果,又没有列入计划之内。②地质勘查要素利用率不高。用行政方法组建的地勘单位,大而全,小而全;所持有的各种手段,在同一时间剩余和不足并存,特别是当单位规模大于地勘费投入时,用于养人头的费用挤占了地质工作的费用。③地勘投入不能循环运转,形成不了长效机制,需要政府不断地加强,方能保持简单再生产和扩大再生产。矿产勘查资金缺少可持续性。
(二)市场调节的地质工作体制机制
市场调节是指经济主体为追求自身利益而主动接受市场信号,从而达到优化配置资源的过程。即通过市场价格的自发涨落,调节供求关系,进而调节生产的增加或减少;也就是说,做什么地质工作,不做什么地质工作,不是由政府决定的,而是由市场决定的。它的基本功能是:可以使地质勘查资源得到优化配置,不会出现完成的地质成果不被利用。它通过市场价格的变化,不断地调节地质工作的各种结构,使各结构之间维持合理均衡;它通过竞争,优胜劣汰,使效率低下的地勘单位不断地被挤出市场之外,从而使社会平均生产率不断地提高;它使供给和需求能够经常地保持平衡,不会出现长久的短缺和过剩。
市场调节的地质工作体制和机制的优点是:①真正能使地质工作的需求和供给得到紧密结合。因为它的地质成果,要么是需求者用资金购买来的,要么是供给者用自己的资金生产,用来换取货币,以便继续再生产。在这种情况下,绝对不会出现生产的地质成果不能被利用。②真正能使地质工作的投入得到经常的有效的补充。以矿产勘查为例,如果是探采结合,它完成的地质成果,要么形成资产通过消耗使用,提取折耗,又形成了新的地质勘查资金;要么通过使用地质成果的主体,在当年作为期间费用,给予推销,进入主体的总成本。③它能有效地规避自然风险。在地质工作中的矿产勘查,特别是普查,充满自然风险,既有能不能找到的风险,也有找到以后能不能被市场接受的风险。在这种情况下,只有找矿主体是用自己的资本进行投入,才能形成有效规避风险的机制。因为任何风险损失,都是资本的损失,所以它会自觉地遵循地质工作规律,把风险损失降到最小限度。④它能有效地提高地质勘查各种工程手段的利用率。由于地质项目所需要的工程手段,在运用时间和地点上带有很大的随机性,即使原来设计已经安排好,但在实际运用中发现与原来的设计不同,也会随时改变。针对这种情况,地质勘查主体,不会用自己组建的队伍去应对,而是通过市场,随叫随到,既节省成本,又快速敏捷。但是这种体制和机制也有缺点和不足:①具有分散性、局部性。这种体制和机制常常使矿业主体太多、太小,想很快形成有影响的大的找矿规模或找矿突破比较困难。②具有一定的盲目性。这种体制和机制主要依靠企业对市场信号的快速反应而做出决策,很容易出现一拥而上,造成短时间内形成大量的供给,致使供给超过需求。可是当发现这种情况时,为时已晚,这就是它的盲目性。③外部环境的恶劣性。这种体制和机制都是社会资金为主体运作,追求的都是资本的收益,没有政府行政权力配合。所以在矿产勘查和开发中,对外部环境所涉及的利益关系,只能靠对等谈判解决。这就可能形成在处理外部环境时难度加大,困难重重,费钱误事。
从以上两种体制和机制的分析中可以看出,单纯的计划调节和单纯的市场调节都不太理想,都各有所长,又都各有所短。如果把二者的长处很好的利用起来,避免二者的短处,形成互补性,该市场调节去干的事让市场去干;该让计划调节去干的事让计划去干。这样的体制和机制,就能使地质工作的运行更为有效。而在这种组合当中,应当有一个主次问题,即以计划为主还是以市场为主。我们认为,在社会主义市场经济体制下,应当以市场调节为主、计划调节为辅,或者称在充分发挥市场对地质勘查资源配置的基础上,进行必要的宏观调控。具体说,也就是地质工作的微观基础必须是企业,只有企业才能对市场信号做出灵敏的反应,即在哪找矿、找什么矿,可以自主选择;在地质找矿中,企业可以自觉地规避风险,追求利益最大化。对市场配置地质勘查资源,政府发现不符合国民经济的整体利益,或发现其不符合政府的总体布局,如可能形成产能过剩或产能短缺,这时政府可以通过行政的、经济的方法或法律手段,进行干预。这种体制和机制,在大多数市场经济国家已经被广泛运用,运行效果很好。
三、《自私的基因》:自私才是人类的本能
中国传统文化核心是引导人向善,对于“公”和“私”有着明确的界定,并一直提倡和鼓励“无我”的精神,弱化小我,而强调与大自然和谐,天人合一的大道。这与西方社会对人所应有的处事态度有着很大的不同。
道德经:自私的行为看似是获取实则是一种失去。
在生活面前,我们总希望世界施于我们善良和温暖,我们感受到世界对我们的爱,这也是我们每一个人存在于潜意识之中的感受。
正因为我们对于这个世界总是在索取,一旦生活没有满足这种期待时,就会产生极其负面的情绪,用沮丧和失望去面对眼前的世界。
其实对于每一个人来说,我们首先不应该期待世界给自己带来温暖,而应当反思,想一下自己有没有用善良去对待这个世界。
古人常说“行有不得,反求诸己”,就是让我们从内在反思修正自己,用正确的状态去面对世界。
如果一个人真正存在正确的价值观,能够带着善良去面对生活的时候,他面前呈现的才是一种完全不同的人生。
《菜根谭》有一句话叫:心体光明,暗室中有青天;念头暗昧,白日下有厉鬼。
意思就是说:心中光明磊落,即使在黑暗的地方,也如同在晴朗的天空下一样;心中邪恶不正,即使在青天白日下,也像有恶鬼一样。
心中光明磊落和邪恶不正的人,所看见的完全是不同的世界,所以我们不能只盯着外界给自己带来的东西,只要在内心呈现真诚与善良之后,自然能在这个世界获取温暖。
王阳明曾经经历过这样一个事情:
在明武宗时期,宁王朱宸濠叛乱,宦官张忠和朱泰想坐收渔翁之利,就鼓动武宗御驾亲征。
但是当他们还没到前线的时候,前线就传来王阳明已经平反朱宸濠的消息,这让两人的阴谋未得逞,于是他们便把这份怨恨记在王阳明头上,并伺机谋求报复。
他们首先在随行军中散布谣言,诽谤王阳明,并且鼓动所有军士肆意谩骂王阳明以及他的士兵,王阳明知道之后不仅没有生气,而且丝毫不为所动,甚至以礼相待。
比如说他派遣自己的手下通告民众,让他们移居乡下,以免殃及无辜,接着又犒赏随驾亲征的北军,每当军中有人伤亡时,王阳明都前去慰问,并给予资金救济。
王阳明又告诫自己的兵士,说北军远离家乡,生活艰苦,我们应该尽地主之谊。
过了一段时间之后,北军把王阳明的这种行为看在眼里,心中颇为感动。
后来冬至将到的时候,按照当地的习俗,这个时候需要人们祭奠亡灵,每家都要到坟上亲手为死去的亲人焚送寒衣,于是在那一年冬至时,王阳明就让城中百姓举行祭奠仪式。
因为军队中有许多人都是常年南征北战,有的在灾难中死去亲人,有的和亲人相隔甚远,于是这一天百姓祭奠亡魂的人特别多,成片的哭声充斥着整个城池,而随行的北军也触景生情,不免潸然泪下,甚至都开始想念家乡,流着泪要求返乡。
标准是用来要求自己的,只有首先保证自己处在温和善良的状态上,才能用这份正向的力量在这个世界上收获更多。
如果在自己没有修养出良好品德的基础上,而一味以自私去获取,那么你不仅得不到你所要求的期望,反而会徒增更多痛苦。
《道德经》有一句话叫:是以圣人后其身而身先,外其身而生存。以其无私邪?故能成其私。
意思就是圣人谦虚谦让,退身于别人后面反而能得到众人爱戴与拥护,他把自己的生死置之度外,反而能够保全自身,正是因为他不自私,所以反而能保全自己。
这样的状态其实也符合了“道”的存在法则,道存在于天地间,生成万物却没有自恃功高。
就像水一样,时时刻刻都在默默灌溉养育着天地万物,却没有表现出尊贵,更没有奢求回报,好似是一种高深莫测的状态,离我们很远又离我们很近。
也正是他的这一番无私之爱,才成就了它本身特定的伟大,伟大到我们的生活不可缺少水的存在。
所以世人常说,人生最好的状态就是“上善若水”。
一个人如果不将自己局限在狭小自私的位置上,才能获取的更多,自私的人看似是获取,实则是一种失去。
就像在生活中许多自私自利,爱贪小利的人,看似能得到一丝小利,但是也正是因为他的贪图眼前小的得失,而失去了许多成大事的机会,也失去了别人永久的信任,所以这也是极其得不偿失的一种行为。
如果此时把眼界放得高一些,心胸放得宽一些,为自己的生命修养出一份厚重感,才能种得今生善果,恩泽后代无量。
“人之初,性本善”,相信很多人都对这句话耳熟能详,并且相信人的天性就是善良的。这句话源自于孟子的“性善论”,也是被人们普遍接受的观点。
然而,事实真得如此吗?如果你读完了理查德的《自私的基因》,你就会发现一个完全颠覆的观点:人们生来是自私的,这才是人性的真相。
《自私的基因》自出版后,就在学术界引起了很大的争议和讨论,该书出版后,全球销量超过100万册,被翻译成20多种语言,引起巨大轰动,“自私的基因”也成了英语中的一个固定词组。
在该书中,作者道金斯将社会学说中的主要论题逐一做了详细介绍,如利他和利己行为的概念、遗传学上的自私的定义、亲族学说(包括亲子关系和群居昆虫的进化)、性比率学说、相互利他主义、欺骗行为和性差别的自然选择等。
很多人听到这会觉得这本书难道只是要传导给我们人类丑陋本性的话题吗?那未免太让人失望和消极了。恰恰相反,作者在叙述了人性自私的事实后想让我们了解真正睿智的人,真正懂得生存之道的人恰恰是懂得克服自私本性的人,况且,尤其是人类是有绝对能力克服自私天性的,因为我们拥有“觅母”——能够开化我们自私基因的文化基因。
毋庸置疑,这是一本专业书,书中时时出现的专业词汇让你有时需要咬咬牙才能认真继续看下去。幸好,它是一本让我们能够看到希望,能够了解“自私是可以被克服,爱是可以遍撒人间”的书。
我们都是基因的复制品
从古至今,几乎人人都想长生不老。然而无论是古时候的炼丹术还是现在的高科技手段,目前都无法做到让人长生不老?以前我们以为人类的死亡是由于人体器官的衰老,书中作者告诉我们,决定人类死亡的是人体的基因。
我们先来了解一下什么是复制基因。在“原始汤”中,也就是30亿到40亿年前的海洋当中,一些有机物慢慢的聚集起来,在受到阳光紫外线等能量的影响后,组合成了一些大的分子。到了某一时刻,一个非凡的分子偶然形成,就是复制基因。
复制基因具有一种特殊的性质—能够复制自己。也就是每一个基因能够复制自己,进而继续发展下去。
当第一个复制基因诞生后,它必然会迅速在海洋里到处扩散它的拷贝,这样我们就到达了一个具有全都一样的复制品。
然而,这种复制不可能是完美无缺的,它准会发生差错。假如复制基因相当于手抄书。在印刷术没有发生以前,书籍的传播都靠手抄,抄写书籍的人无论怎样小心翼翼,都不可避免地会发生差错,更何况有些抄写员还会擅自改动原书。
所以基因在复制自身的过程中出错。随着复制错误的产生和扩散,原始汤中会出现好几个品种的复制分子组成的种群,他们都不是一样的复制品,但他们是同一个基因的复制品。
在原始基因的复制品中,有些基因所含有的内在分子会比其他分子稳定,这种比较稳定的分子一旦形成后就安于现状,不像其他分子那样易于分裂。这种稳定性分子越来越多,那么它们就有充足的时间复制自己。它的后代们也会越来越多。
除了速度外,影响基因延续下去的一个原因是复制基因复制的准确性。也就是,复制基因复制那么我们人类可不可以通过改变基因的方式来延长人类的年龄呢?
基因其实有一个非常显著的特点,那就是它不会衰老。即使是活了100万年的基因也不会比它仅活了100年更有可能死去。也就是说基因用它自己的方式,操纵着一个个个体。它在一代接一代的个体陷入衰老死亡之前先抛弃这些个体。
简单地来说,基因在任何具体个体中要么肯定存在要么肯定不存在。
一个人身体内基因不会被交换所破坏,只是调换了分子继续前行。要想延长年龄,就得主动操纵基因。
假如,我们了解到一个人基因里面的“寿命“因子遇到某个分子寿命就会变短,那么我们就要想办法降低这个分子的准确性或者减少它的复制,那样”寿命“因子就会变强,在复制给下一代时寿命就会增加。
然而,以我们目前的科学研究表明,基因的复制是自发行为,人类只是基因生存的载体,没法控制基因的复制。分子出错的越少,它的后代也越多。
基因自私性的体现
一个基因要成功复制下去很显著的一个特性就是无情的自私性。这种基因的自私性通常会导致个体行为的自私性。也就是说,基因为了确保自己能够生存,会无意识操纵个体做出自私自利的行为。
动物们身上出现的自私行为很普遍,大多是为了争夺食物或者争抢底盘,配偶等。
在我们人类身上,基因同样也支配人类个体做出自私的行为。
假如在一座大楼里,一个年轻人率先感受到了地震并迅速着往外冲。这时,他突然看到了一个老年人因为腿脚不好,正缓慢地走着。这个年轻人会不会停下来背着老年人一起逃生?
如果背着老年人肯定会影响年轻人逃生的速度,说不定因此自己也会死亡。那么年轻人的基因肯定无法继续迭代,显然这不是基因乐意做的事。
根据基因自私理论,基因能够生存下去,首先支配着个体做出自保的行为。因此,基因支配着年轻人赶紧先自己逃生,不管老年人了。
先不用去谴责年轻人的行为,基因让我们人类生来就是自私的。
如果年轻人最终背起老年人一起逃生,这个行为显然很伟大。这是受到人类后天文化的影响,道德影响着个体行为,影响基因的自私性。
在基因的操控下,生物的个体无论做出哪种自私的行为就是正常的。同时,我们人类的生老病死,也是基因进化的规律。
根据达尔文的自然选择方式,更一步证明了基因的自私性:凡是经由自然选择进化而来的任何东西都是自私的。
有时候为了整个物种的更大利益,个体就得成为牺牲品。用词稍雅一点,一个群体,如一个物种或一个物种中的一个种群,如果它的个体成员为了本群体的利益准备牺牲自己,这样的一个群体要比与之竞争的另一个将自己的自私利益放在首位的群体灭绝的可能性要小。
比如在蜂巢中,如果遇到袭击,有些蜜蜂就会发出它们体内的针来对付袭击者。但是,这些蜜蜂最后都是必死无疑。这些为了群体利益而牺牲的个体,它们的利它主义会保护好群体的安全性,那么种族的基因就会完好繁衍下去。
无论是明显的自私行为还是掩盖本质的利他行为,都是在基因的操控下所做出的无意识行为,所有的目的都指向明确:为了基因的持续繁衍。
觅母——制约人性自私的新基因
我们知道基因操纵着个体做出无意识的自私行为。如果我们只能听从基因的安排,那么人人都非常自私,这个社会就无法发展下去了。难道我们真的只能仍由基因摆布吗?
当然不是,在自然界还有一种叫作觅母的机器。它是被人来培养的具有反抗自私基因的一种培养基因。我们人类社会具有独特的文化基因就是觅母。文化的传播和遗传相似的一点是它可以导致某种形式的进化。
就像人类语言,我们每一代人都能和自己的上一代人或者下一代人交谈,能够彼此了解。这种模式就是通过非遗传途径“进化”的,而且速度比遗传进化快几个数量级。
除了语言,人来的饮食习惯、仪式、时装、风俗、艺术和建筑、工程和技术等,所有一切的文化在历史的长河中不断地在进化。其方式看起来好像是高速度的遗传进化,但实际上却和遗传进化无关。
比如说“上帝”这个概念。我们现在不清楚它是怎样在觅母库中形成的,但它通过口头语言和书面文字,在音乐和艺术的协助下进行了复制传播。
上帝这个觅母关于生存的一些深奥而又使人苦恼的问题提供了一个表面上好像言之有理的答案,它对人具有巨大的心里号召力,在人的精神上产生了一定的效果,所以在一代代人们的大脑里复制传播,流传了下来。
这种现象说明觅母通过模仿的方式进行自我复制。觅母和自然选择相似的一点是,觅母库里有些觅母比另外一些觅母能够取得成功。这也解释了为什么有些文化能够流传下来,有些却消失了。在这个世界上,只有我们人类能够反抗自私复制基因的暴政。
正是这些觅母,可以改善人类的自私性。我们从小的文化教育教导我们怎么做人,社会道德约束人类的行为。
基因的自私性让个体为了生存下去想尽办法为自己谋利益,但是有了觅母,个体会开始考虑这样的行为是否得当。
大家大概都听过一个很经典的问题:母亲和女朋友同时掉进河里,应该先救谁?按照基因的自私性,男士首先会救女朋友。女朋友和男士结合,可以让男士的基因得到延续,而母亲在男士身上的基因也会继续繁衍下去。所以基因的自私性决定了男士毫不犹豫救妻子。
但是有了觅母,人类形成下来的文化道德会让男士犹豫。一方面是自己的母亲,处于孝道文化,不应该置母亲于不顾;另一方面是自己的女朋友,对自己同样付出过感情的伴侣,也不能放任不管。因此,这个问题成了一直无法解答的问题。
《自私的基因》对人性自私的本性做了深刻剖析,同时也不完全悲观。
我们要建立一个人与人合作无私、慷慨大度的社会,就不能仍由基因的引导。这就像作者道金斯本人所说的:“让我们设法通过教育,把慷慨大度和利他主义灌输到人们头脑中去吧,因为我们生来是自私的。让我们懂得我们自私的基因居心何在,因为这样我们至少可以有机会去打乱它们的计划,而这是其他物种从来未能希望做到的。”
所幸,我们意识到了这个问题。虽然从基因诞生以来,它的自私性从未改变,但是我们人类已经通过教育等文化建造了一个相对和善的社会。所以我们可以相信道金斯的话:人类完全没有必要绝望,良好的教育可以改变我们的人生。