文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

机器学习中的“学习”到底是个啥?

2024-11-29 19:33

关注

我刚开始了解到这个词的时候,直觉是机器学习和人类学习是类似的,机器竟然已经强大到可以像人类一样学习了,向来不自信的我就觉得这哪是我能学会的技术呢!可以说机器学习这个术语吓住了我,让我不敢尝试去进一步学习它的技术原理,直到很久以后才慢慢对它有了了解。因此我个人是不太喜欢这个词的,不知道是不是有人和我同样的原因放弃或延缓了进一步学习AI的知识。刚好最近学习《深度学习与围棋》第10章发现有一个简单的例子非常适合直观展示到底什么是机器学习中的学习,大家来体会体会。

策略学习与演示

这个例子演示如何让一个程序不断进行策略学习来赢得一个叫做“加加加”的游戏,其实就是个数字游戏,下面是它的游戏规则:

很显然,每个回合选择数字5就是最佳策略,书中之所以选择这么简单的游戏,就是为方便展示策略学习,观察程序如何逐步学习到这个最佳的策略的。

首先,下面的python代码用来模拟一局“加加加”游戏,传入的参数policy是选择各个数字的概率列表,返回值为100回合后胜者和负者所选择的数字次数统计。

import numpy as np
   
def simulate_game(policy):
    """
    模拟加加加游戏,游戏介绍:
    1. 两个玩家每一回合每人选择一个1~5的数字;
    2. 在100回合之后,每个人将他们选择的数字加起来;
    3. 总和最高的人获胜。
    
    返回值:(胜者的选择,负者的选择)
    """
    # 记录玩家选择数字1~5的次数
    player_1_choices = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
    # 记录玩家选择数字的总数
    player_1_total = 0
    player_2_choices = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
    player_2_total = 0


    # 运行100回合
    for i in range(100):
        # 按照policy指定的概率选择1~5中的数字
        player_1_choice = np.random.choice([1, 2, 3, 4, 5], p=policy)
        player_1_choices[player_1_choice] += 1
        player_1_total += player_1_choice


        player_2_choice = np.random.choice([1, 2, 3, 4, 5], p=policy)
        player_2_choices[player_2_choice] += 1
        player_2_total += player_2_choice
    
    if player_1_total > player_2_total:
        winner_choices = player_1_choices
        loser_choices = player_2_choices
    else:
        winner_choices = player_2_choices
        loser_choices = player_1_choices
    return (winner_choices, loser_choices)

接下来就持续模拟游戏,初始策略是所有的数字选择概率都是相同的,为20%,每模拟一局游戏,就将胜利者选择数字的概率增加一点,而失败者选择数字的概率减少一点,这个更新选择数字概率的过程就是“学习”。下面的代码模拟了3000局游戏,并将策略的变化绘制成了曲线。

# 归一化处理选择策略
def normalize(policy):
    # <0的变为0,大于1的变为1,将所有的policy的值限制在0-1范围内
    policy = np.clip(policy, 0, 1)
    # 归一化处理,使得所有概率的总和为1
    return policy / np.sum(policy)


# 要选择的数字列表
choices = [1, 2, 3, 4, 5]
# 初始选择数字的策略,每个数字的选择概率都是20%
policy = np.array([0.2, 0.2, 0.2, 0.2, 0.2])
# 学习率,主要是为了控制策略变化的快慢
learning_rate = 0.0001
# 模拟游戏的局数
num_games = 3000
result = []
# 模拟多局游戏
for i in range(num_games):
  # 模拟一局游戏(100个回合)
  win_counts, lose_counts = simulate_game(policy)
  # 遍历每一个要选择的数字
  for j, choice in enumerate(choices):
    # 计算本局胜利者选择数字的次数-失败者选择此数字的次数,表示胜者和负者的偏差
    net_wins = win_counts[choice] - lose_counts[choice]
    # 将选择此数字的概率根据偏差*学习率增加或减少
    # 为负表明胜者倾向于少选择此数字,为正表明胜者倾向于多选择此数字
    # ===注意这里就是在进行策略的学习===
    policy[j] += learning_rate * net_wins
  # 概率归一化处置
  policy = normalize(policy)
  # 记录局数、更新后的策略值
  result.append((i, policy))
  print(f"{i}: {policy}")
  
# 绘制策略的变化变化曲线
x = [i[0] for i in result]
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
for i in range(5):
  plt.plot(x, [c[1][i] for c in result], label=f"选择数字{i + 1}的概率")
plt.grid(True)
plt.legend(loc="right")
plt.title("加加加游戏策略变化曲线")
plt.show()

下图就是3000局游戏中选择数字策略的变化曲线,从图中可以看出大概2000局之后,程序就学到了最佳策略,即每次都选择数字5,也就是说程序自主学会了怎么在“加加加”游戏中获胜。深度学习要比这个例子复杂的多,但是机器学习的本质都是一样的,都是通过某些手段去调节参数以达到解决问题的目的。

图片

机器学习:一种创新的编程范式

在传统的编程实践中,我们通过精心设计的算法和逻辑来直接解决问题。这种方式要求程序员对问题有深入的理解,并且能够将解决方案明确地编码到程序中。然而,机器学习提供了一种全新的视角,它不是直接针对问题本身,而是将问题转化为数学模型,然后利用数据来训练模型,使其能够自动学习和找到解决问题的方法。

这种范式转变带来了几个关键的思维创新:

将机器学习视为一种编程范式,有助于我们更好地理解其核心价值和潜力。它不仅仅是一系列算法和技术的集合,更是一种全新的思考和解决问题的方式。这种思维方式的创新为解决复杂问题提供了新的可能性,并且正在不断推动科技和社会的进步。

来源:一点鑫得内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯