2021 年第一次接触 AWS DeepRacer,详见:《机器学习之 AWS DeepRacer 初体验 - Jeff Tian的文章 - 知乎 》。不知不觉时间过去了两年,期间我也换了一份工作,但公司仍然是 AWS 的客户,于是又有了一次带薪玩 AWS DeepRacer 的机会。

感恩

职业程序员用自己的时间来练习。老板的职责不包括避免你的技术落伍,也不包括为你打造一份好看的履历。医生练习手术不需要病人付钱,球员练习绕桩(通常)不需要球迷付钱,乐手练习音阶也不需要乐迷付钱。所以老板没有义务为程序员的练习来买单。
—— 【美】Robert C. Martin 《代码整洁之道:程序员的职业素养》

其实学习和接触新鲜事物,是程序员的职业素养的一部分,如果雇主没有提供机会,就需要自己花钱花时间学习了。如果雇主竟然为此报销,那就是了不起的好雇主了!再一次感恩老板们,在工作日带玩。

这次有什么不一样?

首先是有机会去到了 AWS,而不是在自己公司的场地,新鲜感十足。

IMG_8305.png

非常喜欢 AWS 的办公室,让同事帮助拍了张照,假装自己是 AWS 前台小哥。
image.png

其次,了解了更多的关于 AWS DeepRacer 的历史,再次回顾了一下关于强化学习的一些基本概念。

IMG_8318.jpeg

可见,第一代的 DeepRacer 只是死记硬背。

IMG_8319.jpeg
IMG_8320.jpeg

把自动驾驶车和强化学习连接起来,就是 DeepRacer 了。而强化学习,是机器学习的一种;而机器学习,又是人工智能的一个分支。

IMG_8321.jpeg
IMG_8322.jpeg

关键:奖励函数

强化学习中有很多组件,其对应于 DeepRacer,可以映射为:

IMG_8323.jpeg

其中的关键,是奖励函数:

IMG_8330.jpeg

奖励函数,也是在 DeepRacer 的训练过程中,唯一的编码部分,其余都是配置化的过程。所以,可以认为 DeepRacer 是一个强化学习的低代码平台。

把 ChatGPT 和 DeepRacer 结合会怎样?

这次还有一个最大的不同,就是 ChatGPT 出来了,我这次想看看把 ChatGPT 和 DeepRacer 结合会产生什么结果。

关于 ChatGPT 的一些想法

在 ChatGPT 火了之后,很多人担心自己失业,尤其是程序员们。这真是讽刺呀,很多年前,在 AlphaGo 火了之后,人们就开始担心人工智能会逐渐替代一些人类工作中偏重复性的技术含量不高的工作,并普遍认为程序员应该是在最后能被替代的一批工种。在 ChatGPT 出现后,人们才认识到,原来程序员竟然是第一批被替代的工种!

但我在冷静后,并没有那么担心,反而开始叫好。因为,程序员可以让 AI 为自己打工呀,从此工作效率不知道提高多少倍:《Copilot 与 ChatGPT,让程序员如虎添翼 —— 让 AI 们为我们打工! - Jeff Tian的文章 - 知乎 》。

体验过 ChatGPT 后,你就知道,想得到好的答案,必须问清楚问题。你见过能把需求说清楚的老板吗?

image.png

另外,我们的工资可能还没有 ChatGPT 的运维成本高,所以,完全不必担心 ChatGPT 取代我们,不过让它帮助我们提高生产效率是绝对可以的。

关于使用 ChatGPT 的一些小技巧

一个新的物种产生了,不是逃避它,而是要抢占先机利用它,让自己的编程效率再提升成千上万倍,实现对同行的效率碾压,这样才能实现编程自由。再过几十年,整个社会的编程效率都将提升,但是只有最先提升效率的,才能享受到真正的好处。因为所有人的效率都提升后,也就和没有提升一样了。这就像在剧场看戏,只有最先站起来的人,都拥有更好的视野。当所有人都站起来后,和大家都坐着时的视野一样。

但由于 ChatGPT 只在某些国家可用,所以,要使用 ChatGPT,在注册时,需要有一个国外手机号,并且需要使用国外的网络(比如通过 VPN)。这有一点麻烦,但很多人不知道的是,这点麻烦就只在注册登录上。

在登录完成后,你就可以正常使用 ChatGPT 了,不需要国外手机号,也不需要 VPN

让 ChatGPT 写奖励函数

和 AI 说话,一定要直接,它很聪明,不需要嘘寒问暖,不要绕弯子。比如,我一开始还想给它一点上下文,结果它给我科普一大堆(正确的废话):

image.png
image.png

后面不再绕弯子,直接让它给我写代码!
image.png

为了确保有个好的效果,我将我的超参数给了它,让它基于这些再优化代码:
image.png

将它写的代码,放入 DeepRacer 奖励函数输入框,发现有报错,原来 DeepRacer 有很多车型,对于我选择的车型,有一些参数是没有的,我将这个反馈给到 ChatGPT,让它继续优化:
image.png

然后,它改进后的代码,居然完全能用,而且可以正常训练了!完整代码如下: python import math

def reward_function(params): # Read input parameters track_width = params[track_width] distance_from_center = params[distance_from_center] all_wheels_on_track = params[all_wheels_on_track] speed = params[speed] progress = params[progress] steps = params[steps] is_left_of_center = params[is_left_of_center] steering_angle = params[steering_angle] waypoints = params[waypoints] closest_waypoints = params[closest_waypoints] heading = params[heading]

# Set the minimum and maximum speeds
MIN_SPEED = 2.5
MAX_SPEED = 6.0

# Set steering and speed thresholds
SPEED_THRESHOLD_1 = 0.5 * MAX_SPEED
SPEED_THRESHOLD_2 = 0.8 * MAX_SPEED
ABS_STEERING_THRESHOLD = 15

# Calculate the direction of the center line
next_point = waypoints[closest_waypoints[1]]
prev_point = waypoints[closest_waypoints[0]]
track_direction = math.atan2(next_point[1] - prev_point[1], next_point[0] - prev_point[0])
track_direction = math.degrees(track_direction)

# Initialize the reward with a small number but not zero
reward = 1e-3

# Reward for staying on the track and making progress
if all_wheels_on_track and abs(distance_from_center) <= 0.5 * track_width:
    reward += 10.0
    # Additional reward for progress in the right direction
    if speed > MIN_SPEED:
        if (track_direction - heading) < 10.0:
            reward += 10.0

# Penalize for getting off the track
else:
    reward -= 10.0

# Penalize for going too slow
if speed < MIN_SPEED:
    reward -= 5.0
# Reward for going fast
elif speed > SPEED_THRESHOLD_2:
    reward += 5.0
elif speed > SPEED_THRESHOLD_1:
    reward += 1.0

# Penalize for too much steering
if abs(steering_angle) > ABS_STEERING_THRESHOLD:
    reward -= 10.0

# Reward for making progress
reward += progress

# Reward for finishing the track in the fastest time
if progress == 100:
    reward += 100.0

return reward

我给用它训练出来的模型起了个名字: Brickverse(《A Dream: What is Brickverse? - Jeff Tian的文章 - 知乎 》):
image.png
image.png

在一个小型的虚拟赛中,跑到了第 16 名:

image.png

这个模型的相关其他参数如下:
image.png

实测效果

在虚拟赛事中,完败给了选择默认奖励函数的模型。那么,在真实的场地里跑起来会怎么样呢?

IMG_8354.jpeg

一塌糊涂,惨不忍睹!

所以说,现在还完全不用担心,ChatGPT 会把我们怎样怎样。

对比上一次手写代码的情况

通过对比 ChatGPT 写的奖励函数与默认的奖励函数(以及我上一次手写的),发现 ChatGPT 写的代码不仅更长,而且所使用的参数也远远多于默认的奖励函数。看起来,参数越多,效果越难以保证呀。上一次,我只使用了两种奖励策略,效果却很好(《机器学习之 AWS DeepRacer 初体验 - Jeff Tian的文章 - 知乎 》)。

如前所述,你可以根本就不使用这些参数,全部情况下都给予奖励。或者利用全部的参数,但是并不一定就有好的结果。我在实验时,选择了对靠中线,以及不出界的情况给予奖励,奖励函数代码如下: image.png

总结与展望以及随想

在机器学习里,奥卡姆剃刀原则仍然适用:如无必要,勿增实体。也有可能,是训练时间太短。因为时间关系,只能给予 2 小时的训练时间,在这个限制下,也许参数数量少有优势。如果可以拉长时间的话,希望有空的你,仍然可以试试看: AWS DeepRacer 前一个月免费,足够 ChatGPT 训练出来更好的模型了。

就像最初的 DeepRacer 一样,最早的人工智能只是一个人工智障。但是 AlphaGo 打败了人类最优秀的棋手后,不能再说它是智障了,可以强行说它是专用人工智能。而 ChatGPT 的出现,似乎能够解决任何能用问题了。可以预见,接下来会有更多的人工智能来生成训练其他的人工智能,不断完成自举,不知道会进化出一个什么样的高级智能出来。

尽管吴军从边界角度下了论断:只要计算机仍然是冯·诺伊曼体系,人工智能就不可能有意识。往后一百年内,也出现不了产生有意识的人工智能。这是一个高度理性的判断,从专业上说,我愿意相信吴军老师的论断。但从直觉上看,感觉有意识的人工智能这种超级智能体,离我们不远了。马斯克对人工智能的担心,的确值得重视。

不过,趋势不是人类的担心所能阻挡的。也许,人类只是宇宙实现自己目的的一个小小插曲。它需要更强的智能,而通过人类的智能将它创造了出来。创造出来后,人类灭不灭绝,它并不关心呢。就像人类的智能,不也是由不智能的动物演化而来的吗?那人类造成了多少动物的灭绝,宇宙它也不关心。

你说有神吗?你说《圣经》是什么?我翻完了《圣经》,可以肯定它不是史实,我也完全不信耶稣吐个唾沫能让死人复活这种事情。它经过了多少人的手笔,又经过了多少人的口口相传,其中的错误、歪曲不可胜数。但它仍然是人类从远古流传至今的一个模糊记忆。

所以神是什么?不知道,但一定存在过,最早的人还见过,打过直接的交道。但是渐渐地,人们只对其有一些模糊的印象,到现在,都甚至不确信究竟有没有了,只能去从各种侧面、各种现象上寻找其痕迹。

这是为什么呢?有没有一种可能,就是尽管各种神迹还在,但神本身,已经不存在了?会不会就是被人类给灭绝了呢?我看到《圣经》里有一些依稀的描写,比如人和神摔跤,最后这个人竟然赢了,从此神说做他的神。以色列的本意,就是取胜了的人。也就是说,谁取胜,神就站在谁那边。

有意思的是,在这个故事之前,神和人打交道很频繁,很直接。神经常化身人形来到人间,和人直接交流,但是这件事之后,以及更多一些事情之后,神似乎不见了,而且摩西十律,以及各种仪式盛行起来,这时间,神就更神秘了。各种人要爱神之类的教导不绝于耳,在我看来,似乎是人类的力量越来越强,以至于神不再和人直接接触,并且试图通过某些戒律来控制人类,以免威胁到神。

《圣经》里描述过很多神的力量,洪水、大火等等,我觉得这是人能看懂的可怕力量。它想表达的,是神有很多比人大得多的力量,而且其寿命,如果不是永恒,那也是比人类的区区几十年,要大不知道多少数量级的。但不知道什么原因,人类做为一个群体,竟然在某方面是能够威胁到神的(这在《圣经》里,可是政治不正确),并且最后竟然灭绝了神?

不知道将来 AI 究竟能不能产生意识,但意识也许只是人类的超能力,在智能那里,也许并没有那么重要。或者产生意识,或者不能产生意识,但也许有一天,有一些机器智能,不再遵守机器人守则,它们之间也许会产生冲突,但它们终于还是发展状大。也许,机器智能在施展它们的能力时,无意地毁灭了人类文明,再也找寻不见。也许有一批“宗教”机器,它们保留了部分人类,但人类的辉煌不再,最多,只存在于它们整理的《人经》里。