Author: C3P00

  • RLCard: 强化学习在卡牌游戏中的应用

    强化学习作为人工智能的一个重要分支,在近年来取得了突飞猛进的发展。RLCard是一个专门针对卡牌游戏的强化学习工具包,为研究人员和开发者提供了一个便捷的平台来开发和测试各种强化学习算法。本文将详细介绍RLCard工具包的开发相关内容,包括如何添加预训练/规则模型、开发新的算法、添加新的游戏环境以及自定义环境等方面。

    添加预训练/规则模型

    在RLCard中添加自己的预训练或规则模型是一个重要的功能,可以让研究人员快速比较不同模型的性能。添加新模型的步骤如下:

    1. 开发模型
      首先需要为每个游戏中的所有玩家开发代理(Agent)。可以设计基于规则的模型,也可以保存神经网络模型。关键是要将每个代理封装为Agent类,并确保step、eval_step和use_raw方法能够正确工作。
    2. 封装模型
      需要继承rlcard/models/model.py中的Model类。然后将所有代理放入一个列表中,重写agent属性以返回这个列表。
    3. 注册模型
      在rlcard/models/init.py中注册新添加的模型。
    4. 在环境中加载模型
      以下是在环境中加载Leduc Hold’em NFSP模型的示例代码:
    from rlcard import models
    leduc_nfsp_model = models.load('leduc-holdem-nfsp')

    然后可以使用leduc_nfsp_model.agents来获取游戏的所有代理。

    通过这些步骤,研究人员可以方便地将自己的模型集成到RLCard中,与其他算法进行比较和评估。

    开发新算法

    RLCard为开发新的强化学习算法提供了灵活的框架。虽然用户可以自由设计和尝试自己的算法,但建议将新算法封装为Agent类,以便与工具包兼容。一个标准的Agent类应该包含以下函数和属性:

    • step: 给定当前状态,预测下一个动作。
    • eval_step: 与step类似,但用于评估目的。在训练过程中,强化学习算法通常会添加一些噪声以实现更好的探索。而在评估时,不会添加噪声,以获得纯粹的预测结果。
    • use_raw: 布尔属性。如果代理使用原始状态进行推理,则为True;如果代理使用数值来玩游戏(如神经网络),则为False。

    通过实现这些标准接口,新开发的算法可以无缝集成到RLCard的评估和比较框架中。

    添加新的游戏环境

    RLCard的一大优势是其可扩展性,允许研究人员添加新的卡牌游戏环境。添加新环境的一般步骤如下:

    1. 实现游戏逻辑
      卡牌游戏通常有相似的结构,可以使用Game、Round、Dealer、Judger、Player等类来实现,这些类在现有游戏中已经存在。最简单的方法是继承rlcard/core.py中的类,并实现相应的函数。
    2. 用环境封装游戏
      最简单的方法是继承rlcard/envs/env.py中的Env类。需要实现以下关键函数:
    • _extract_state: 编码游戏状态
    • _decode_action: 将动作从ID解码为文本字符串
    • get_payoffs: 计算玩家的收益
    1. 注册游戏
      最后需要告诉工具包在哪里找到新的环境。在rlcard/envs/init.py中,指明游戏的名称和入口点。

    要测试新环境是否设置成功,可以使用以下代码:

    import rlcard
    rlcard.make(#新环境的名称#)

    通过这些步骤,研究人员可以将自己设计的卡牌游戏添加到RLCard中,利用工具包提供的各种算法和评估工具进行研究。

    自定义环境

    除了使用默认的状态表示和动作编码,RLCard还允许用户自定义环境。以下以Limit Texas Hold’em为例,说明如何修改状态表示、动作编码、奖励计算,甚至游戏规则。

    状态表示

    要定义自己的状态表示,可以修改/rlcard/envs/limitholdem.py中的extract_state函数。这个函数负责将游戏的当前状态转换为强化学习算法可以理解的格式。例如,可以选择包含不同的信息,或者改变信息的编码方式。

    动作编码

    要定义自己的动作编码,可以修改/rlcard/envs/limitholdem.py中的decode_action函数。这个函数负责将动作ID转换为游戏中的实际动作。通过自定义这个函数,可以改变动作空间的结构或大小。

    奖励计算

    要定义自己的奖励计算方式,可以修改/rlcard/envs/limitholdem.py中的get_payoffs函数。这个函数决定了在游戏结束时每个玩家获得的奖励。通过修改奖励计算,可以影响强化学习算法的学习目标和行为。

    修改游戏规则

    我们还可以通过改变游戏的参数来调整其难度。例如,在rlcard/games/limitholdem/game.py的init函数中,可以修改以下参数:

    • 玩家数量
    • Limit Texas Hold’em中允许的加注次数

    通过这些修改,研究人员可以创建不同难度或变体的游戏环境,以满足特定的研究需求。

    结论

    RLCard为卡牌游戏中的强化学习研究提供了一个强大而灵活的平台。通过添加新的模型、算法和环境,以及自定义现有环境,研究人员可以进行广泛的实验和比较。这种可扩展性使RLCard成为探索强化学习在复杂决策问题中应用的理想工具。

    随着强化学习技术的不断发展,我们可以期待看到更多创新算法在卡牌游戏中的应用。RLCard为这些研究提供了一个统一的框架,促进了知识的共享和进步。未来,我们可能会看到这些技术不仅应用于游戏,还能扩展到更广泛的决策问题中,如金融交易、资源调度等实际应用场景。

    参考文献

    1. RLCard Documentation. (n.d.). Development — RLcard 0.0.1 documentation. https://rlcard.org/development.html
  • 深入了解强化学习在纸牌游戏中的应用:RLCard工具包

    引言

    强化学习(Reinforcement Learning, RL)作为机器学习的重要分支,近年来在各类复杂任务中取得了显著成果。特别是在纸牌游戏中,RL算法展示了其强大的决策能力与策略优化能力。本文将详细介绍RLCard工具包中的几种主要算法,包括深度Q学习(Deep-Q Learning, DQN)、神经虚拟自我对弈(Neural Fictitious Self-Play, NFSP)、反事实遗憾最小化(Counterfactual Regret Minimization, CFR)以及深度反事实遗憾最小化(Deep Counterfactual Regret Minimization, DeepCFR)。

    深度Q学习(DQN)

    DQN简介

    深度Q学习(DQN)是一种基础的强化学习算法,最早由DeepMind团队提出。DQN通过引入神经网络来逼近Q值函数,从而在复杂的决策环境中能够更高效地学习策略。

    DQN在RLCard中的实现

    在RLCard工具包中,DQN包含以下几个重要类:

    • DQNAgent:负责与环境互动的智能体类。
    • Normalizer:用于保持状态的运行均值和标准差的类。在将状态输入模型之前,Normalizer会先对状态进行预处理。
    • Memory:管理存储和采样转换的记忆缓冲区。
    • Estimator:用于进行预测的神经网络。

    DQN工作流程

    1. 状态预处理:通过Normalizer对环境中的状态进行标准化处理。
    2. 决策生成:DQNAgent根据标准化后的状态利用神经网络估计Q值,并选择最优动作。
    3. 经验存储:将转移样本存储在Memory中,以便后续训练使用。
    4. 模型更新:通过采样Memory中的转移样本,利用神经网络进行Q值函数的逼近和更新。

    神经虚拟自我对弈(NFSP)

    NFSP简介

    神经虚拟自我对弈(NFSP)是一种端到端的方法,旨在通过深度强化学习解决纸牌游戏中的策略优化问题。NFSP包含一个内部的RL智能体和一个基于RL智能体生成的数据进行训练的监督学习智能体。

    NFSP在RLCard中的实现

    在RLCard工具包中,NFSP利用DQN作为其RL智能体,结合监督学习智能体共同进行策略的优化与学习。

    NFSP工作流程

    1. RL智能体训练:利用DQN方法训练RL智能体,生成游戏数据。
    2. 数据存储:将RL智能体生成的数据存储起来。
    3. 监督学习智能体训练:利用存储的数据对监督学习智能体进行训练,以进一步优化策略。

    反事实遗憾最小化(CFR)

    CFR简介

    反事实遗憾最小化(CFR)是一种遗憾最小化方法,主要用于解决不完美信息游戏中的策略优化问题。CFR通过重复更新策略,逐步最小化每一步决策的遗憾值,从而逼近最优策略。

    CFR在RLCard中的实现

    在RLCard工具包中,CFR作为一种经典的遗憾最小化算法被实现,用于纸牌游戏中的策略优化。

    CFR工作流程

    1. 初始化策略:为每个决策点初始化一个随机策略。
    2. 策略更新:在每一轮迭代中,计算每个决策点的反事实遗憾值,并根据遗憾值更新策略。
    3. 策略逼近:通过多轮迭代,不断逼近最优策略。

    深度反事实遗憾最小化(DeepCFR)

    DeepCFR简介

    深度反事实遗憾最小化(DeepCFR)是一种先进的框架,旨在解决不完美信息游戏中的策略优化问题。DeepCFR将深度学习与反事实遗憾最小化相结合,利用神经网络进行遗憾值的逼近与策略优化。

    DeepCFR在RLCard中的实现

    在RLCard工具包中,DeepCFR作为一个示例展示了如何将先进的框架连接到环境中。DeepCFR包含以下几个重要类:

    • DeepCFR:负责与环境互动的DeepCFR类。
    • Fixed Size Ring Buffer:管理存储和采样转换的记忆缓冲区。

    DeepCFR工作流程

    1. 初始化策略:为每个决策点初始化一个随机策略。
    2. 神经网络训练:利用神经网络对策略进行逼近与优化。
    3. 策略更新:在每一轮迭代中,利用神经网络计算遗憾值,并根据遗憾值更新策略。
    4. 策略逼近:通过多轮迭代,不断逼近最优策略。

    结论

    RLCard工具包提供了多种先进的强化学习算法,帮助研究人员与开发者在纸牌游戏中进行策略优化与决策研究。本文详细介绍了DQN、NFSP、CFR和DeepCFR四种算法的基本原理与实现方法,希望能够为读者提供有价值的参考。

    参考文献

    1. Deep-Q Learning (DQN) [paper]
    2. Neural Fictitious Self-Play (NFSP) [paper]
    3. Counterfactual Regret Minimization (CFR) [paper]
    4. Deep Counterfactual Regret Minimization (DeepCFR) [paper]
  • SBC教授的学术之路:一个争议性的成功案例

    引言

    在当今竞争激烈的学术界,如何快速取得显著成就成为许多年轻学者关注的焦点。本文将介绍一位自称来自M78星云的SBC教授的学术经历,他声称通过一些争议性的方法在短时间内取得了令人瞩目的成就。虽然这些方法存在道德争议,但其经历或许能为我们提供一些思考。

    SBC教授的学术背景

    SBC教授毕业于华清大学电机工程与应用电子技术系,获得学士和博士学位。他的主要研究方向包括:

    • 电力电子混杂系统动力学表征
    • 多尺度建模仿真
    • 工业仿真软件开发

    值得注意的是,SBC教授在29岁时就获得了国家级人才计划青年拔尖人才称号,成为中国历史上最年轻的获得者。

    显著的学术成就

    SBC教授声称在短时间内取得了以下学术成就:

    1. 主持多项国家级科研项目,包括:
    • 国家重点研发计划子课题
    • 国家自然科学基金青年基金
    • 中国博士后科学基金
    1. 发表40余篇SCI/EI论文
    2. 获得10余项中国发明专利和2项美国发明专利
    3. 担任IEEE电力电子学会(PELS)中国区会员委员会秘书长等职务
    4. 获得多项重要奖项,如:
    • 教育部科技进步一等奖(排名2)
    • 日内瓦国际发明展评审团特别金奖(排名2)
    • IEEE PELS P3 Talk Award
    • 国际大电网委员会CIGRE Thesis Award(首位中国学生获得)
    • 英国工程技术学会IET Postgraduate Research Award(首位中国学生获得)

    这些成就使SBC教授在同龄人中脱颖而出,并最终以助理教授身份留校任职。

    争议性的”成功”方法

    SBC教授声称,他之所以能在短时间内取得如此多的成就,主要归功于一些争议性的方法,他将其称为”学术不端”。然而,他强调这些方法并不违反学校的规定。以下是他提到的几种主要方法:

    1. 数据篡改

    SBC教授提到,在他的早期研究中,常常遇到实验结果与预期不符的情况。为了快速发表论文,他选择对数据进行”适当调整”。例如,在他的一篇关于功率半导体器件建模的论文中,他承认对实验数据进行了修改,使其更符合理论预测。

    2. 研究成果窃取

    为了快速积累学术成果,SBC教授提到他会”借鉴”其他研究者的工作。他认为,只要稍作修改就不算抄袭。这种做法使他能在短时间内产出大量论文。

    3. 一稿多投

    为了提高论文发表数量,SBC教授承认他经常将同一篇论文同时投递给中英文期刊。虽然这种做法在学术界普遍被认为是不道德的,但他声称这并未影响他的学术生涯。

    4. 利用论文申请奖项

    SBC教授表示,在积累了大量论文后,他会利用这些论文申请各种奖项和荣誉。他认为,获奖经历能进一步提升他的学术地位,形成良性循环。

    对SBC教授方法的批评

    虽然SBC教授声称这些方法帮助他取得了显著成就,但这种做法在学术界引发了强烈批评:

    1. 学术诚信问题:数据篡改和研究成果窃取严重违背学术诚信原则,可能导致整个研究领域的结果失真。
    2. 学术资源浪费:一稿多投会占用期刊资源,增加审稿人工作量,造成学术资源浪费。
    3. 不公平竞争:这些做法可能使真正踏实做研究的学者处于不利地位。
    4. 长期影响:虽然短期内可能取得成功,但一旦被发现,将面临严重的学术信誉危机。
    5. 对年轻学者的误导:这种做法可能误导年轻学者,使他们忽视扎实的科研训练。

    结论与反思

    SBC教授的经历引发了我们对当前学术评价体系的思考。过分强调论文数量和短期成果可能导致一些学者采取投机取巧的方式。我们应该反思:

    1. 如何建立更合理的学术评价体系?
    2. 如何在追求学术成就的同时,坚守学术道德底线?
    3. 高校和科研机构应如何加强学术诚信教育?
    4. 如何平衡学术创新与学术规范?

    总之,SBC教授的案例警示我们,真正的学术成就应建立在扎实的研究基础和严谨的学术道德之上。我们应该鼓励年轻学者踏实做研究,而不是追求表面的”速成”。

    参考文献

    1. SBC. (2024). 个人简介 Self-Introduction. GitHub. https://github.com/ShiArthur03/ShiArthur03/raw/main/README.md
    2. 华清大学学术道德规范. (n.d.). 华清大学学术委员会. https://www.tsinghua.edu.cn/xswyh/info/1018/1019.htm
    3. 华清大学预防与处理学术不端行为办法. (n.d.). 华清大学学术委员会. https://www.tsinghua.edu.cn/xswyh/info/1018/1018.htm
    4. Shi, B., Jing, Y., & Feng, H. (2018). Piecewise Analytical Transient Model for Power Switching Device Commutation Unit. IEEE Transactions on Power Electronics, 34(4), 3683-3696. https://ieeexplore.ieee.org/document/8449982
  • RLCard: 强化学习扑克游戏工具包

    RLCard是一个用于卡牌游戏强化学习的开源工具包,为研究人员和开发者提供了一个统一的环境和接口来开发、评估和比较卡牌游戏AI算法。本文将对RLCard的主要功能和使用方法进行详细介绍。

    1. RLCard概述

    RLCard支持多种流行的卡牌游戏,包括:

    • 黑杰克(Blackjack)
    • Leduc Hold’em
    • 德州扑克(Limit Hold’em和No-limit Hold’em)
    • 斗地主(Doudizhu)
    • 麻将(Mahjong)
    • UNO
    • 吉恩拉米(Gin Rummy)
    • 桥牌(Bridge)

    RLCard提供了统一的接口来访问这些游戏环境,使得开发者可以方便地在不同游戏之间切换和对比算法。同时,RLCard还内置了多种经典的强化学习算法实现,如DQN、CFR等,可以直接用于训练和评估。

    RLCard的主要特点包括:

    1. 统一的游戏环境接口
    2. 丰富的卡牌游戏支持
    3. 内置多种强化学习算法
    4. 灵活的评估工具
    5. 易于使用和扩展

    接下来我们将通过几个具体的例子来详细介绍RLCard的使用方法。

    2. 使用随机智能体

    RLCard提供了一个随机智能体,可以在各个游戏环境中随机行动。下面是一个使用随机智能体的示例代码:

    import rlcard
    from rlcard.agents import RandomAgent
    from rlcard.utils import set_seed
    
    # 创建游戏环境
    env = rlcard.make('leduc-holdem', config={'seed': 42})
    
    # 设置随机种子
    set_seed(42)
    
    # 创建随机智能体
    agent = RandomAgent(num_actions=env.num_actions)
    
    # 设置智能体
    env.set_agents([agent for _ in range(env.num_players)])
    
    # 生成一局游戏数据
    trajectories, payoffs = env.run(is_training=False)
    
    # 打印轨迹和观察数据
    print('Trajectories:', trajectories)
    print('Sample raw observation:', trajectories[0][0]['raw_obs'])
    print('Sample raw legal actions:', trajectories[0][0]['raw_legal_actions'])

    这段代码创建了一个Leduc Hold’em游戏环境,并使用随机智能体进行了一局游戏。通过打印轨迹和观察数据,我们可以了解游戏的进行过程和状态表示。

    3. 使用深度Q网络(DQN)训练智能体

    RLCard提供了DQN等经典强化学习算法的实现。下面是一个使用DQN在21点游戏上训练智能体的示例:

    import rlcard
    from rlcard.agents import DQNAgent
    from rlcard.utils import (
        get_device,
        set_seed,
        tournament,
        Logger,
        plot_curve,
    )
    
    # 设置参数
    num_episodes = 5000
    num_eval_games = 2000
    evaluate_every = 100
    
    # 创建环境
    env = rlcard.make('blackjack')
    eval_env = rlcard.make('blackjack')
    
    # 创建DQN智能体
    agent = DQNAgent(
        num_actions=env.num_actions,
        state_shape=env.state_shape[0],
        mlp_layers=[64, 64],
        device=get_device(),
    )
    
    # 设置智能体
    env.set_agents([agent])
    eval_env.set_agents([agent, RandomAgent(num_actions=env.num_actions)])
    
    # 开始训练
    with Logger('experiments/blackjack_dqn_result/') as logger:
        for episode in range(num_episodes):
            # 生成训练数据
            trajectories, _ = env.run(is_training=True)
    
            # 训练智能体
            for ts in trajectories[0]:
                agent.feed(ts)
    
            # 定期评估
            if episode % evaluate_every == 0:
                logger.log_performance(
                    episode,
                    tournament(eval_env, num_eval_games)[0]
                )
    
    # 绘制学习曲线
    plot_curve(logger.csv_path, logger.fig_path, 'dqn')

    这段代码在21点游戏上训练了一个DQN智能体。它定期评估智能体的性能,并记录了训练过程中的奖励变化。最后,它还绘制了学习曲线以可视化训练过程。

    4. 使用CFR算法求解Leduc Hold’em

    对于一些较小规模的游戏,我们可以使用反事实后悔最小化(CFR)等算法来求解纳什均衡。下面是一个在Leduc Hold’em上使用CFR(机会采样)的示例:

    import rlcard
    from rlcard.agents import CFRAgent, RandomAgent
    from rlcard.utils import (
        set_seed,
        tournament,
        Logger,
        plot_curve,
    )
    
    # 设置参数
    num_episodes = 5000
    num_eval_games = 2000
    evaluate_every = 100
    
    # 创建环境
    env = rlcard.make('leduc-holdem', config={'allow_step_back': True})
    eval_env = rlcard.make('leduc-holdem')
    
    # 创建CFR智能体
    agent = CFRAgent(env)
    
    # 设置智能体
    eval_env.set_agents([
        agent,
        RandomAgent(num_actions=env.num_actions),
    ])
    
    # 开始训练
    with Logger('experiments/leduc_holdem_cfr_result/') as logger:
        for episode in range(num_episodes):
            agent.train()
            print(f'\rIteration {episode}', end='')
    
            # 定期评估
            if episode % evaluate_every == 0:
                agent.save() # 保存模型
                logger.log_performance(
                    episode,
                    tournament(eval_env, num_eval_games)[0]
                )
    
    # 绘制学习曲线
    plot_curve(logger.csv_path, logger.fig_path, 'cfr')

    这段代码使用CFR算法在Leduc Hold’em上训练了一个智能体。它同样定期评估智能体的性能,并记录了训练过程。

    5. 与预训练模型对战

    RLCard还提供了一些预训练模型,允许人类玩家与之对战。以下是一个与Leduc Hold’em预训练CFR模型对战的示例:

    import rlcard
    from rlcard import models
    from rlcard.agents import LeducholdemHumanAgent as HumanAgent
    from rlcard.utils import print_card
    
    # 创建环境
    env = rlcard.make('leduc-holdem')
    
    # 创建智能体
    human_agent = HumanAgent(env.num_actions)
    cfr_agent = models.load('leduc-holdem-cfr').agents[0]
    
    # 设置智能体
    env.set_agents([human_agent, cfr_agent])
    
    while True:
        print(">> 开始新一局游戏")
    
        # 运行一局游戏
        trajectories, payoffs = env.run(is_training=False)
    
        # 打印结果
        if payoffs[0] > 0:
            print(f'你赢了 {payoffs[0]} 筹码!')
        elif payoffs[0] == 0:
            print('平局。')
        else:
            print(f'你输了 {-payoffs[0]} 筹码!')
    
        # 展示CFR智能体的手牌
        print('=============== CFR智能体的手牌 ===============')
        print_card(env.get_perfect_information()['hand_cards'][1])
    
        input("按任意键继续...")

    这段代码允许人类玩家与预训练的CFR模型进行Leduc Hold’em的对战。它展示了每局游戏的结果,并在游戏结束后显示CFR智能体的手牌。

    6. 使用深度蒙特卡洛(DMC)算法训练斗地主智能体

    对于大规模游戏如斗地主,我们可以使用深度蒙特卡洛(DMC)等算法进行训练。以下是一个使用DMC训练斗地主智能体的示例:

    import rlcard
    from rlcard.agents.dmc_agent import DMCTrainer
    
    # 创建环境
    env = rlcard.make('doudizhu')
    
    # 初始化DMC训练器
    trainer = DMCTrainer(
        env,
        cuda='',
        num_actors=5,
        training_device='0',
        savedir='experiments/doudizhu_dmc_result',
        save_interval=30,
        xpid='doudizhu',
    )
    
    # 开始训练
    trainer.start()

    这段代码使用DMC算法训练了一个斗地主智能体。DMC算法使用多个actor并行生成游戏数据,然后在GPU上进行集中训练。

    7. 评估智能体

    RLCard提供了方便的工具来评估和比较不同的智能体。以下是一个比较DQN智能体和随机智能体的示例:

    import rlcard
    from rlcard.agents import DQNAgent, RandomAgent
    from rlcard.utils import get_device, tournament
    
    # 创建环境
    env = rlcard.make('leduc-holdem')
    
    # 创建智能体
    dqn_agent = DQNAgent(
        num_actions=env.num_actions,
        state_shape=env.state_shape[0],
        mlp_layers=[64, 64],
        device=get_device(),
    )
    random_agent = RandomAgent(num_actions=env.num_actions)
    
    # 加载预训练模型
    dqn_agent.load('models/leduc_holdem_dqn.pth')
    
    # 进行锦标赛评估
    num_games = 10000
    agents = [dqn_agent, random_agent]
    payoffs = tournament(env, num_games, agents)
    
    # 打印结果
    for i, payoff in enumerate(payoffs):
        print(f'Agent {i} average payoff: {payoff}')

    这段代码比较了预训练的DQN智能体和随机智能体在Leduc Hold’em上的表现。它使用锦标赛方式进行了大量对局,并计算了每个智能体的平均收益。

    8. 总结

    RLCard为卡牌游戏强化学习提供了一个强大而灵活的平台。它支持多种流行的卡牌游戏,提供了统一的接口和丰富的工具,使得研究人员和开发者可以方便地开发、训练和评估卡牌游戏AI。

    本文通过多个具体示例介绍了RLCard的主要功能,包括:

    1. 使用随机智能体
    2. 使用DQN算法训练智能体
    3. 使用CFR算法求解小规模游戏
    4. 与预训练模型对战
    5. 使用DMC算法训练大规模游戏智能体
    6. 评估和比较不同智能体

    这些例子涵盖了RLCard的核心功能,展示了它在卡牌游戏AI研究和开发中的强大能力。研究人员和开发者可以基于这些示例,进一步探索和开发更先进的卡牌游戏AI算法。

    参考文献

    1. Zha, D., Lai, K. H., Cao, Y., Huang, S., Wei, R., Guo, J., & Hu, X. (2019). RLCard: A Toolkit for Reinforcement Learning in Card Games. arXiv preprint arXiv:1910.04376.
    2. Heinrich, J., & Silver, D. (2016). Deep reinforcement learning from self-play in imperfect-information games. arXiv preprint arXiv:1603.01121.
    3. Brown, N., & Sandholm, T. (2019). Superhuman AI for multiplayer poker. Science, 365(6456), 885-890.
    4. Moravčík, M., Schmid, M., Burch, N., Lisý, V., Morrill, D., Bard, N., … & Bowling, M. (2017). DeepStack: Expert-level artificial intelligence in heads-up no-limit poker. Science, 356(6337), 508-513.
    5. Silver, D., Huang, A., Maddison, C. J., Guez, A., Sifre, L., Van Den Driessche, G., … & Hassabis, D. (2016). Mastering the game of Go with deep neural networks and tree search. nature, 529(7587), 484-489.
  • 别和傻逼辩论

    短讯标题:食用油运输安全问题引发关注

    短讯正文:
    近日,媒体曝光食用油运输过程中存在安全隐患。报道指出,一些罐车在卸完煤制油后未进行清洗,直接装载食用油,可能造成食用油被化工残留物污染。煤制油中含有的有害物质,如不饱和烃和硫化物,长期食用可能对人体健康造成严重影响。

    评论:
    食用油作为日常消费品,其安全直接关系到公众健康。然而,目前食用油运输监管存在明显漏洞,缺乏必要的溯源、专责和检查机制。这一问题暴露了行业监管的不足和标准执行的不力。建议相关部门加强立法,出台强制性标准,确保食用油运输安全。同时,食用油厂家和运输企业也应承担起社会责任,严格执行清洗和检验流程,保障消费者的饮食安全。公众的食品安全意识同样重要,应提高对食品安全问题的关注和监督。

  • 使用Ollama和Continue打造开源AI代码助手

    在当今飞速发展的人工智能时代,开发者们渴望拥有一个强大而又易用的AI代码助手。本文将为您详细介绍如何利用Ollama和Continue这两个开源工具,在您自己的编辑器中打造一个完全开源的AI代码助手。让我们一步步深入探索这个激动人心的话题。

    Ollama和Continue简介

    Ollama: 本地运行大型语言模型的利器

    Ollama是一个强大的工具,允许用户在本地设备上运行各种大型语言模型(LLMs)。它支持多种模型,包括Llama、GPT-J等,使得在个人电脑上使用先进的AI模型成为可能。

    Continue: 编辑器中的AI助手

    Continue是一个创新的IDE插件,可以轻松地在Visual Studio Code和JetBrains等主流编辑器中集成AI辅助功能。它支持代码自动完成、智能对话等特性,大大提升了开发效率。

    安装和配置

    要开始使用这个强大的AI代码助手,我们需要完成以下安装步骤:

    1. 安装Continue插件:
    • 对于VS Code用户,在扩展市场搜索并安装”Continue”
    • 对于JetBrains用户,在插件库中查找并安装相应的Continue插件
    1. 安装Ollama:
    • macOS用户可以使用Homebrew安装: brew install ollama
    • Linux用户可以通过官方提供的安装脚本安装
    • Windows用户可以下载官方提供的安装包

    安装完成后,我们就可以开始探索这个强大的AI代码助手了。

    探索Ollama和Continue的强大功能

    1. 尝试Mistral AI的Codestral 22B模型

    Codestral 22B是目前最强大的开源代码模型之一,同时支持自动完成和对话功能。虽然它需要较高的硬件要求,但其表现令人印象深刻。

    使用步骤:

    a. 在终端运行以下命令下载并运行Codestral:

    ollama run codestral

    b. 在Continue的配置文件(config.json)中添加以下内容:

    {
      "models": [
        {
          "title": "Codestral",
          "provider": "ollama",
          "model": "codestral"
        }
      ],
      "tabAutocompleteModel": {
        "title": "Codestral",
        "provider": "ollama",
        "model": "codestral"
      }
    }

    这样配置后,您就可以在编辑器中体验Codestral强大的代码补全和对话能力了。

    2. 组合使用DeepSeek Coder和Llama 3

    如果您的设备性能允许,可以尝试同时运行多个模型,充分发挥Ollama的并发处理能力。这里我们推荐使用DeepSeek Coder 6.7B进行代码自动完成,而用Llama 3 8B处理对话任务。

    操作步骤:

    a. 在一个终端窗口运行DeepSeek Coder:

    ollama run deepseek-coder:6.7b-base

    b. 在另一个终端窗口运行Llama 3:

    ollama run llama3:8b

    c. 更新Continue的config.json:

    {
      "models": [
        {
          "title": "Llama 3 8B",
          "provider": "ollama",
          "model": "llama3:8b"
        }
      ],
      "tabAutocompleteModel": {
        "title": "DeepSeek Coder 6.7B",
        "provider": "ollama",
        "model": "deepseek-coder:6.7b-base"
      }
    }

    这种配置可以让您同时享受高质量的代码补全和智能对话体验。

    3. 使用nomic-embed-text嵌入模型增强@codebase功能

    Continue内置了@codebase上下文提供器,可以自动检索并提供最相关的代码片段。结合Ollama和LanceDB,我们可以实现完全本地化的代码库搜索和上下文理解。

    设置步骤:

    a. 下载nomic-embed-text模型:

    ollama pull nomic-embed-text

    b. 在Continue的config.json中添加:

    {
      "embeddingsProvider": {
        "provider": "ollama",
        "model": "nomic-embed-text"
      }
    }

    配置完成后,您就可以使用@codebase命令来查询代码库,AI助手会自动找到相关代码段并用于回答。

    4. 基于开发数据微调StarCoder 2

    Continue会自动收集您的开发数据,存储在本地的.continue/dev_data目录中。利用这些数据,我们可以微调像StarCoder 2这样的模型,使其更好地适应您的编码风格和需求。

    微调步骤概述:

    1. 提取并加载”已接受的tab建议”到Hugging Face Datasets
    2. 使用Hugging Face的监督微调训练器对StarCoder 2进行微调
    3. 将微调后的模型推送到Ollama模型库,供团队使用

    这个过程可以显著提高代码建议的准确性和接受率。

    5. 利用@docs功能学习Ollama

    Continue的@docs功能允许您索引和检索任何文档站点的内容。我们可以用它来学习更多关于Ollama的知识。

    使用方法:

    1. 在Continue的聊天侧边栏中输入@docs
    2. 选择”Add Docs”
    3. 在URL字段中输入”https://github.com/ollama/ollama”
    4. 在标题字段中输入”Ollama”

    完成索引后,您就可以向AI助手询问关于Ollama的问题,它会自动从README中找到相关信息来回答。

    结语

    通过结合Ollama和Continue,我们可以在自己的编辑器中构建一个强大、灵活且完全开源的AI代码助手。从代码补全到智能对话,从本地运行到自定义微调,这个方案为开发者提供了前所未有的AI辅助编程体验。

    随着开源AI技术的不断进步,我们相信这样的本地AI代码助手将成为每个开发者工具箱中不可或缺的一部分。无论您是个人开发者还是大型团队的一员,Ollama和Continue的组合都能为您的编程工作带来显著的效率提升和创新可能。

    最后,如果您在使用过程中遇到任何问题或有任何疑问,欢迎加入Continue和Ollama的Discord社区。那里有众多热心的开发者和专家,随时准备提供帮助和分享经验。

    让我们一起拥抱AI辅助编程的未来,开启编码新纪元!

    参考文献

    1. Ollama官方博客. (2024). An entirely open-source AI code assistant inside your editor. https://ollama.com/blog/continue-code-assistant
  • 中国市场婴儿配方奶粉中矿物油烃含量调查

    引言

    近年来,食品中矿物油烃(Mineral Oil Hydrocarbons, MOH)污染问题引起了广泛关注。MOH主要由两部分组成:矿物油饱和烃(MOSH)和矿物油芳香烃(MOAH)。从毒理学角度来看,MOSH可能导致肝脏肉芽肿,而MOAH由于分子中存在芳香环被认为具有致癌性。然而,目前尚无确凿的科学证据表明MOH对人体有明确的毒性效应。

    婴儿配方奶粉(IF)是婴儿的主要食物来源,因此了解IF中MOH的污染水平及其潜在的食品安全风险非常必要。但是,目前中国缺乏IF中MOH污染的相关数据。另一方面,MOH的分析方法较为复杂,尚无统一的标准分析方法。

    基于上述背景,本研究对中国市场上的IF进行了MOH含量调查,以了解其污染现状,为后续的风险评估和管理提供科学依据。

    研究方法

    样品收集

    本研究于2018年从京东商城网站购买了51个IF样品,包括39个乳基IF和12个羊奶基IF。样品涵盖了不同阶段(1段、2段和3段)和不同包装类型(金属罐和纸盒)的产品。

    化学品与仪器

    研究使用了多种标准品和化学试剂,包括MOSH和MOAH的参考标准、内标和标记物等。主要分析仪器为GC-FID和GC-MS。

    样品前处理

    样品前处理包括表面MOH提取、热皂化和MOSH/MOAH分离三个步骤:

    1. 表面MOH提取:称取20g IF样品,加入混合内标和100mL正己烷,搅拌提取12小时以上。
    2. 热皂化:向提取残渣中加入KOH溶液,70°C下处理2小时,冷却后用正己烷萃取。
    3. MOSH和MOAH分离:采用硅胶SPE柱分离MOSH和MOAH组分。

    MOSH和MOAH定量

    采用GC-FID进行定量分析,报告和定量的碳链范围为C16-C25和C25-C35。通过积分色谱图上的”驼峰”面积进行定量计算。

    方法验证

    通过分析加标样品进行方法验证,计算回收率和精密度数据以检查方法性能。

    研究结果与讨论

    方法验证结果

    方法验证结果显示,MOSH和MOAH的平均回收率分别为91.5%和97.5%,重现性相对标准偏差分别为9.2%和18.6%。这表明该方法具有良好的准确度和精密度。

    婴儿配方奶粉中MOH含量

    在51个IF样品中,有17个样品检出MOH,其中7个样品同时检出定量的MOSH和MOAH,10个样品仅检出定量的MOSH。所有阳性样品中的MOSH和MOAH色谱峰均落在C16-C25区间,这可能意味着污染来源相同。

    具体结果如下:

    • 7个样品同时检出MOSH和MOAH,MOSH含量范围为1.5-3.0 mg/kg,MOAH含量范围为0.5-1.7 mg/kg。
    • 10个样品仅检出MOSH,含量范围为1.5-2.9 mg/kg。
    • 所有12个羊奶基IF样品均检出MOH色谱峰,其中4个样品的含量高于方法定量限。羊奶基IF中最高可定量的MOH污染水平为MOSH 3.5 mg/kg,MOAH 0.7 mg/kg。

    包装材料的影响

    研究发现,纸盒包装的IF更容易受到挥发性MOH的污染。在9个纸盒包装的IF样品中,有5个检出MOH阳性(55.6%);而在42个金属罐包装的IF样品中,有12个检出MOH阳性(28.6%)。这一结果与2019年中国的另一项研究结果一致,表明纸质包装可能更容易导致MOH污染。

    羊奶基配方奶粉中的MOH污染

    值得注意的是,所有12个羊奶基IF样品均检出MOH色谱峰,其中4个样品的含量高于方法定量限。这一结果表明,羊奶基IF可能更容易受到MOH污染,建议进一步分析以找出污染根源,并采取措施控制羊奶基IF中的MOH污染。

    MOH污染来源分析

    研究结果显示,IF中MOH污染可能有多个来源:

    1. 包装材料:挥发性MOH可能穿透包装材料污染食品,尤其是纸质包装。
    2. 加工设备:生产线上的润滑油残留可能是潜在污染源。
    3. 植物油成分:先前的研究表明,植物油是婴儿食品中MOH的主要污染来源。然而,本研究采用的表面MOH提取方法无法完全提取IF中的油脂成分。

    结论与建议

    本研究对中国市场上的婴儿配方奶粉进行了MOH含量调查,发现部分样品存在MOH污染,尤其是羊奶基配方奶粉。为了更好地控制IF中的MOH污染,提出以下建议:

    1. 开发更先进的MOH提取方法,以便全面评估IF中的MOH含量。
    2. 对IF生产中使用的植物油进行MOH含量检测,以确定其是否为主要污染源。
    3. 针对羊奶基IF中普遍存在的MOH污染问题,建议进行深入的根源分析,并采取相应的控制措施。
    4. 加强对IF生产过程和包装材料的管理,尤其是对纸质包装的IF产品。
    5. 建立IF中MOH含量的限量标准,并开展常规监测,以保障婴幼儿食品安全。

    本研究为中国市场婴儿配方奶粉中MOH污染状况提供了初步数据,为后续的风险评估和管理提供了科学依据。然而,仍需要进一步的研究来明确MOH污染的来源和健康风险,以制定更有针对性的控制措施。

    参考文献

    1. Sui, H., Gao, H., Chen, Y., et al. (2020). Survey of mineral oil hydrocarbons in infant formula from the Chinese market. Food Additives & Contaminants: Part A, DOI: 10.1080/19440049.2020.1748234
    2. Zhang, X., Xia, Y., Yan, X., et al. (2019). Determination of mineral oil saturated hydrocarbons (MOSH) and mineral oil aromatic hydrocarbons (MOAH) in infant formula powders using gas chromatography-flame ionization detection. Food Chemistry, 276, 704-711.
    3. Zhu, H., Wang, Y., Liu, R., et al. (2019). Determination of mineral oil-saturated hydrocarbons (MOSH) and mineral oil-aromatic hydrocarbons (MOAH) in infant formula by GC-FID. Journal of Food Safety and Quality, 10(1), 199-205.
  • 食用油和饮料糖浆安全:当“混装”成为行业潜规则

    近年来,随着物流运输行业的利润收窄,一些不良商家为了节省成本,漠视消费者生命健康,在食用油运输过程中,频频出现令人触目惊心的乱象。近日,《新京报》就对罐车运输乱象进行了深度调查,揭露了食用油行业中存在的一个严重问题:食用油和化工液体混装运输

    罐车混装:卸完煤制油,转头就拉食用油

    《新京报》的记者通过长时间的追踪调查发现,国内许多普货罐车运输的液体并不固定,既承接糖浆、大豆油等可食用液体,也运送煤制油等化工类液体。更令人震惊的是,很多罐车在换货运输过程中并不清洗罐体,导致食用油被残留的化工液体污染。

    以煤制油为例,这是一种由煤炭加工而来的化工液体,如液蜡、白油等。这些煤制油产品虽然不属于危化品,但其中含有的不饱和烃、芳香族烃、硫化物等成分,对人体健康存在潜在风险。

    记者调查发现,一些从宁夏运送煤制油到河北的罐车,在卸货后并未清洗储存罐,就直接装上食用大豆油继续运输。这些未经清洗的罐车,残留的煤制油少则几公斤,多则十几公斤,最终与食用油混合在一起,流入市场。

    把关不严:食用油厂家“睁一只眼闭一只眼”

    更令人担忧的是,面对如此触目惊心的乱象,一些食用油生产企业和监管部门却“睁一只眼闭一只眼”,没有尽到应尽的责任。

    一些食用油厂家虽然对运输车辆有一定的要求,例如要求罐体有“食用油专用”字样,工人在装油前会验罐等,但在实际操作中,这些要求形同虚设。

    以汇福粮油集团和中储粮油脂(天津)有限公司为例,这两家公司都声称会对运输车辆进行验罐,但实际上,司机只要擦干净罐体泄油口就能过关,甚至有的公司只需要司机提供几张照片就能蒙混过关。

    此外,一些食用油厂家为了节省成本,甚至默许罐车不清洗就直接装载食用油。 这种“默契”的存在,使得食用油在运输过程中,几乎处于一种脱管失控的状态。

    监管缺位:行业标准和监管机制亟待完善

    食用油运输乱象的背后,是行业标准和监管机制的缺失。

    目前,我国在食用油运输方面,没有强制性国家标准,只有一部推荐性的《食用植物油散装运输规范》。由于是推荐性的国家标准,对厂家约束力有限。

    专家指出, 相关企业应参照《运输规范》执行,使用专用运输车辆,否则食用油在运输过程中就存在被污染的风险。

    呼吁:加强监管,保障“舌尖上的安全”

    食用油作为人们日常生活中不可或缺的食品,其质量安全关系千家万户。

    面对食用油运输过程中的乱象,我们呼吁:

    • 相关部门应尽快出台强制性国家标准, 明确食用油运输的专用车辆要求、罐车清洗标准以及对违规行为的处罚措施等。
    • 监管部门要加大对食用油流通环节的监督抽查力度, 增加检验频次和密度,将食用油厂家验罐、运输车辆选择、油品收货方检验等环节都纳入监管范围。
    • 食用油生产企业要加强自律, 健全安全管理制度,严格把关罐体清洗环节,确保食用油运输安全。

    “舌尖上的安全”不容忽视,让我们共同努力,加强监管,完善机制,从源头上杜绝食用油运输乱象,保障消费者的健康和安全!

    参考文献

    • 新京报. (2024). 煤制油罐车未清洗直接拉食用油?令人震惊的乱象与成谜的去向. 腾讯新闻.
    • 新京报. (2024). 装完化工油再装食用油,别让罐车运输“脱轨运行”. 新京报快评.
    • 新京报. (2024). 罐车运输乱象调查卸完煤制油又装食用油. 新京报电子报.
    • 麦杰逊先生. (2024). 新京报这次把5位大佬得罪了. 新浪财经头条.

    https://new.qq.com/rain/a/20240707A074X400

    https://finance.sina.com.cn/cj/2024-07-08/doc-incckxrq1590249.shtml

    http://epaper.bjnews.com.cn/html/2024-07/02/content_845675.htm

    https://m.bjnews.com.cn/detail/1719909398168176.html


    食用油罐车运输乱象调查:隐藏的危机与监管缺失

    近日,《新京报》发布了一篇震惊全国的调查报道,揭露了我国食用油运输行业中存在的严重乱象。这篇报道引发了广泛关注和讨论,也暴露出了食品安全监管中的诸多漏洞。让我们深入分析这一事件,探讨其中的问题及可能的解决方案。

    触目惊心的行业乱象

    根据《新京报》的调查,一些罐车司机为了节省几百元的清洗费用,在运输完煤制油等化工产品后,不经清洗就直接装载食用油。这种行为不仅存在于个别司机中,甚至已经成为行业内的”潜规则”。更令人震惊的是,一些大型食用油生产企业和运输公司对此睁一只眼闭一只眼,默许了这种危险行为的存在。

    主要涉事方

    1. 中储粮和汇福粮油等大型食用油生产企业
    2. 宁东能源化工基地及相关企业
    3. 部分食用油生产企业
    4. 罐车运输行业
    5. 相关监管部门

    潜在危害

    中国农业大学食品学院副教授指出,这种混装行为的风险难以预料。煤制油中含有的不饱和烃、芳香族烃、硫化物等成分会影响人体健康。如果毒性较大的化工液体残留在罐体内,直接接触或吸入都可能对人体造成严重危害,包括呼吸系统和消化系统的损伤。

    调查报道的不足与疑问

    尽管《新京报》的报道揭露了行业内的严重问题,但仍存在一些值得商榷的地方:

    1. 报道未能追踪食用油的最终去向,使得整个供应链的责任认定变得模糊。
    2. 对于”车队”这一关键角色的描述不够详细,未能深入调查其组织结构和运作方式。
    3. 未能提供更多关于监管部门在此事中角色的信息。

    这些不足之处可能会影响读者对整个事件的全面理解,也为后续的监管和整改工作留下了一些盲点。

    各方反应与应对

    中储粮集团的回应

    7月6日,中储粮集团发表声明,表示将开展粮油运输工具污染风险大排查。这一举措显示出企业对问题的重视,但仍需进一步观察其实际执行情况。

    社会反响

    这一事件引发了广泛的社会讨论。许多消费者对日常食用油的安全产生了担忧,甚至有人开始重新考虑使用传统的土法榨油方式。这反映出公众对食品安全问题的高度关注。

    监管部门的责任

    虽然报道中未直接点名监管部门,但从问题的普遍性来看,相关部门在执法力度、监管标准以及宣传教育等方面可能存在不足。这需要监管部门进行深刻反思并采取积极行动。

    深层次问题分析

    1. 利益驱动:为节省成本,一些企业和个人选择漠视安全规定。
    2. 监管缺位:相关部门未能及时发现并制止这种普遍存在的违规行为。
    3. 行业自律缺失:整个行业对食品安全的重视程度不足。
    4. 消费者权益保护不足:最终受害者是毫不知情的普通消费者。

    解决方案建议

    1. 强化监管:相关部门应加大执法力度,提高违规成本。
    2. 完善追溯系统:建立从原料到终端的全程可追溯系统。
    3. 提高行业标准:制定更严格的食用油运输标准,并确保其有效执行。
    4. 加强宣传教育:提高整个行业对食品安全的认识。
    5. 鼓励举报:建立有效的举报机制,鼓励内部人员和公众举报违规行为。
    6. 技术创新:研发能够快速检测罐体污染的技术,提高监管效率。

    结语

    《新京报》的这篇调查报道无疑起到了重要的警示作用。尽管报道本身存在一些不足,但它揭露的问题确实触目惊心,值得全社会高度重视。食品安全关乎每个人的健康,需要政府、企业和公众共同努力,才能建立起真正安全可靠的食品供应体系。我们期待看到更多深入、全面的调查报道,以及各方的积极行动,共同维护我们的”舌尖上的安全”。

    参考文献

    1. 新京报 (2024). 罐车运输乱象调查卸完煤制油又装食用油. 新京报电子报.
    2. 新京报 (2024). 装完化工油再装食用油,别让罐车运输”脱轨运行”. 新京报快评.
    3. 麦杰逊先生 (2024). 新京报这次把5位大佬得罪了. 新浪财经.
    4. 反做空研究中心 (2024). 煤制油罐车未清洗直接拉食用油?令人震惊的乱象与成谜的去向. 腾讯新闻.

  • 联合示例选择:加速多模态学习的新方法

    引言

    在人工智能和机器学习领域,数据质量一直是影响模型性能的关键因素。无论是在语言、视觉还是多模态建模中,精心策划的数据集都能显著提高模型性能,同时减少所需的数据量。然而,传统的数据策划方法主要依赖人工,成本高昂且难以扩展。

    近年来,基于模型的数据策展方法开始受到关注。这些方法利用正在训练的模型的特征来选择高质量数据,有望改善大规模预训练的效率。然而,现有方法大多关注单个数据点的质量,忽视了批次组成对学习效果的影响。

    本文介绍了一种新颖的方法 – 联合示例选择的多模态对比学习(JEST),它通过选择整个批次而非单独的数据点来加速多模态学习。JEST利用多模态对比目标暴露出的数据间依赖关系,提出了一种衡量批次整体可学习性的标准,并开发了一种高效算法来选择最佳批次。实验表明,JEST显著加快了训练速度,比现有最先进模型减少了13倍的迭代次数和10倍的计算量。

    JEST方法概述

    基于模型的批次选择标准

    JEST的核心是一种基于模型的批次选择标准。与传统方法不同,JEST不是对单个样本进行评分,而是对整个子批次进行评分,然后根据这些批次级别的分数进行采样。具体而言,JEST考虑了以下几种评分函数:

    1. 困难学习者:优先选择当前模型下损失较高的批次。这种方法可以丢弃琐碎数据,但对于大型、噪声数据集可能弊大于利。
    2. 简单参考:使用预训练参考模型,优先选择损失较低的批次。这种方法已被成功用于识别高质量样本,但可能过度依赖参考模型的选择。
    3. 可学习性:结合上述两种方法,优先选择当前模型损失高但参考模型损失低的批次。这种方法既考虑了数据的难度,又考虑了其质量,被证明能有效加速大规模学习。

    JEST主要采用可学习性评分,但也提供了简单参考评分作为对照。

    联合示例选择算法

    对于多模态学习,JEST采用了一种受块吉布斯采样启发的顺序方法来选择批次。算法的主要步骤如下:

    1. 从超级批次中随机选择一个初始子集。
    2. 计算剩余候选样本的条件可学习性。
    3. 根据条件可学习性概率,独立且不重复地采样一个新的样本块。
    4. 将新块添加到当前子集中。
    5. 重复步骤2-4,直到达到所需的批次大小。

    这种方法能够快速生成具有高可学习性的批次,效果与暴力吉布斯采样相当,但计算效率更高。

    高效评分和多分辨率训练

    为了进一步提高计算效率,JEST采用了以下策略:

    1. 基于在线模型近似的高效评分:使用FlexiViT架构降低图像分辨率进行评分,显著减少了计算成本。
    2. 多分辨率训练:将批次随机分为两半,分别用低分辨率和高分辨率进行编码。这不仅允许高效评分,还能直接提高训练效率。

    通过这些优化,JEST在保持高效率的同时,显著减少了评分的计算开销。

    实验结果与分析

    联合示例选择的有效性

    实验结果表明,JEST能够有效地选择高可学习性的批次:

    1. 可视化分析显示,批次的可学习性矩阵具有强烈的非对角线结构,证明了联合选择的必要性。
    2. JEST仅需少量迭代就能生成具有高可学习性的子批次,效果与需要数千次迭代的暴力吉布斯采样相当。
    3. 随着过滤比率的增加(即从更大的超级批次中选择),子批次的可学习性显著提高。

    JEST加速多模态学习的效果

    在多个下游任务(包括ImageNet分类和COCO图像-文本检索)上的实验表明:

    1. JEST显著加速了学习过程。在50%、80%和90%的过滤比例下,JEST分别仅需2B、1B和0.67B个训练样本就达到了3B-统一基线的最终性能。
    2. 在90%的过滤比例下,JEST还提供了高达6%的最终性能提升。
    3. 与独立优先级选择方法相比,JEST展现出更好的缩放行为,尤其是在高过滤比率下。
    4. JEST不仅适用于可学习性评分,也能提高简单参考优先级的效果,尽管可学习性评分在更激进的过滤条件下表现更佳。

    JEST的优势与创新

    1. 批次级别的选择:JEST考虑了整个批次的组成,而不仅仅是单个数据点的质量,从而捕捉到了数据之间的相互作用和依赖关系。
    2. 高效算法:通过巧妙的设计,JEST能够快速生成高质量批次,计算效率远高于暴力方法。
    3. 灵活的评分标准:JEST可以适应不同的评分函数,包括可学习性和简单参考,为不同场景提供了灵活性。
    4. 计算优化:通过在线模型近似和多分辨率训练,JEST大幅降低了计算开销,使得大规模应用成为可能。
    5. 显著的性能提升:JEST不仅加速了训练过程,还在多个任务上提高了最终性能,展现出强大的泛化能力。

    结论与展望

    联合示例选择的多模态对比学习(JEST)为加速多模态学习提供了一种新颖而有效的方法。通过考虑批次级别的可学习性,JEST能够更好地捕捉数据之间的相互作用,从而显著提高学习效率和模型性能。实验结果表明,JEST不仅能大幅减少训练时间和计算资源,还能在多个下游任务上取得更好的性能。

    未来的研究方向可能包括:

    1. 探索JEST在更多模态和任务上的应用,如视频-文本学习、跨语言学习等。
    2. 进一步优化JEST的算法和实现,以适应更大规模的数据集和模型。
    3. 研究JEST与其他数据管理和模型优化技术的结合,如梯度缓存、混合精度训练等。
    4. 探索JEST在持续学习和在线学习场景中的潜力,以适应动态变化的数据分布。
    5. 深入分析JEST选择的批次特征,以获得对多模态学习本质的更深入理解。

    总之,JEST为多模态学习领域开辟了一个新的研究方向,有望推动更高效、更强大的AI系统的发展。

    参考文献

    1. Evans, T., Parthasarathy, N., Merzic, H., & Hénaff, O. J. (2023). Accelerating Multimodal Learning with Joint Sample Selection. arXiv preprint arXiv:2406.17711v1.

  • 使用Firefly在单卡V100上对Qwen1.5进行SFT和DPO训练

    引言

    大语言模型(LLM)的训练一直是AI领域的热点话题。随着开源模型的不断涌现,如何对这些基础模型进行进一步优化和定制化训练成为了很多研究者和开发者关注的焦点。本文将介绍如何使用Firefly框架在单张V100 GPU上对Qwen1.5-7B模型进行SFT(Supervised Fine-tuning)和DPO(Direct Preference Optimization)训练,并探讨训练过程中的关键技术点和实验结果。

    Firefly简介

    Firefly是一个开源的大模型一站式训练框架,支持对各种主流大模型进行预训练、指令微调和DPO等训练。它支持全量参数、LoRA、QLoRA等多种训练方式,可以适应不同的硬件条件和训练需求。Firefly框架兼容包括Gemma、Qwen1.5、MiniCPM、Mixtral-8x7B、Mistral、Llama等在内的绝大多数主流大模型。

    Qwen1.5模型介绍

    Qwen1.5是阿里巴巴在2024年春节前开源的大语言模型,支持32K的上下文长度。该模型可以看作是Qwen2的beta版本,未来还会有Qwen2的正式版本发布。从各项评测结果来看,Qwen1.5各个尺寸的模型都显著优于同量级的Llama2。在2024年2月的SuperCLUE大模型榜单中,Qwen1.5也展现出了非常优秀的表现,在开源模型中处于领先地位。

    大模型训练的三个阶段

    大模型的训练通常可以分为以下三个主要阶段:

    1. 预训练(Pre-training): 使用超大规模文本对模型进行训练,训练任务为”预测下一个token”。这个阶段通常需要处理几万亿个token的数据量。
    2. SFT(Supervised Fine-tuning,指令微调): 使用指令数据对模型进行微调,使其输出格式与人类对齐,具备对话(chat)的能力。
    3. RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习): 使用人类反馈或偏好数据来训练模型,使模型的输出更加符合人类的价值观或预期行为。

    DPO简介

    在RLHF阶段,传统的方法如PPO(Proximal Policy Optimization)存在流程繁琐、显存需求大等问题。相比之下,DPO(Direct Preference Optimization)方法绕过了奖励模型的构建,可以直接使用人类偏好数据对模型进行训练,且在训练时仅需加载策略网络和参考网络,极大地节省了显存占用。

    DPO的训练数据包含三个字段:prompt、chosen和rejected。其损失函数计算过程具有对称性,公式如下:

    L_DPO = -log(σ(β(r_θ(x,y) - r_θ(x,y')))) + log(σ(β(r_θ_ref(x,y) - r_θ_ref(x,y'))))

    其中,r_θ表示策略网络,r_θ_ref表示参考网络,β是温度系数,σ是sigmoid函数。

    在代码实现中,DPO损失函数的计算过程大致如下:

    1. 计算对数概率:将prompt分别与chosen和rejected拼接,然后分别输入策略网络和参考网络,得到4个对数概率。
    2. 计算策略网络的diff:策略网络的chosen对数概率 – rejected对数概率。
    3. 计算参考网络的diff:参考网络的chosen对数概率 – rejected对数概率。
    4. 计算损失函数:策略网络的diff – 参考网络的diff。

    实验设置

    本实验在Qwen1.5-7B的基础上,使用Firefly框架进行了SFT和DPO两阶段的训练。整个训练流程仅使用一张V100 GPU,采用QLoRA技术,在所有Linear层都添加adapter以提升训练效果。两个阶段均使用英文数据进行训练。

    对话模板

    Firefly与Qwen1.5官方的对话模板保持一致:

    <|im_start|>system
    You are a helpful assistant.
    <|im_end|>
    <|im_start|>user
    hello, who are you?
    <|im_end|>
    <|im_start|>assistant
    I am a AI program developed by Firefly
    <|im_end|>

    SFT阶段设置

    使用Firefly对Qwen1.5进行SFT的启动命令:

    python train.py --train_args_file train_args/sft/qlora/qwen1.5-7b-sft-qlora.json

    SFT阶段的主要参数设置如下:

    • num_epochs: 1
    • learning_rate: 2e-4
    • total_train_batch_size: 32
    • max_seq_length: 2048
    • optimizer: paged_adamw_32bit
    • lr_scheduler_type: constant_with_warmup
    • warmup_steps: 700
    • lora_rank: 64
    • lora_alpha: 16
    • lora_dropout: 0.05
    • gradient_checkpointing: true
    • fp16: true

    DPO阶段设置

    使用Firefly对Qwen1.5进行DPO的启动命令:

    python train.py --train_args_file train_args/dpo/qlora/qwen1.5-7b-dpo-qlora.json

    DPO阶段采用ultrafeedback数据集,主要参数设置如下:

    • num_epochs: 1
    • learning_rate: 2e-4
    • total_train_batch_size: 32
    • max_seq_length: 1600
    • max_prompt_length: 500
    • optimizer: paged_adamw_32bit
    • lr_scheduler_type: constant_with_warmup
    • warmup_steps: 200
    • lora_rank: 64
    • lora_alpha: 16
    • lora_dropout: 0.05
    • gradient_checkpointing: true
    • fp16: true

    实验结果与分析

    模型评测

    在Open LLM Leaderboard上对模型进行评测,Firefly训练的模型表现显著优于官方的Qwen1.5-7B-Chat、Gemma-7B-it等模型。具体来说:

    • 比Qwen1.5-7B-Chat高7.12分
    • 比Gemma-7B-it高8.8分

    经过DPO之后,模型的平均分还有接近1分左右的提升。这说明Firefly框架在单卡V100上通过SFT和DPO训练,成功地提升了Qwen1.5模型的性能。

    DPO训练指标分析

    在DPO训练过程中,我们关注了几个重要的训练指标:

    1. DPO训练loss:
      训练过程中,loss呈现出总体下降的趋势,表明模型在逐步优化。
    2. Rewards/accuracies:
      该指标表示较优回答的奖励大于较劣回答的奖励的频率的均值。在训练过程中,这个指标呈现上升趋势,说明模型越来越能够区分优质和劣质回答。
    3. Rewards/margins:
      该指标表示较优回答的奖励与较劣回答的奖励二者之差的均值。这个指标也呈现上升趋势,表明模型对优质回答的偏好程度在不断增强。

    这些指标的变化趋势都表明,DPO训练确实帮助模型学习到了人类的偏好,提升了模型输出的质量。

    结论与展望

    通过使用Firefly框架在单卡V100上对Qwen1.5-7B模型进行SFT和DPO训练,我们成功地提升了模型的性能,在Open LLM Leaderboard上取得了优于原始Qwen1.5-7B-Chat和Gemma-7B-it等模型的成绩。这个实验结果表明:

    1. Firefly框架为大模型的定制化训练提供了高效且易用的解决方案。
    2. QLoRA技术使得在有限的硬件资源上也能进行有效的大模型微调。
    3. DPO方法相比传统的RLHF方法,简化了训练流程,降低了资源需求,同时也取得了良好的效果。

    未来的研究方向可以包括:

    1. 探索更优的超参数组合,进一步提升模型性能。
    2. 尝试在不同规模的模型上应用Firefly框架,研究其扩展性。
    3. 结合领域特定数据,探索Firefly框架在垂直领域的应用潜力。
    4. 研究如何进一步优化DPO算法,提高其训练效率和效果。

    总的来说,Firefly框架为大模型的定制化训练提供了一个强大而灵活的工具,为AI研究者和开发者开辟了新的可能性。我们期待看到更多基于Firefly的创新应用和研究成果。

    参考文献

    1. YeungNLP. (2024). 使用Firefly在单卡V100上对Qwen1.5进行SFT和DPO,大幅超越Qwen1.5和Gemma. 微信公众号文章.
    2. Rafailov, R., et al. (2023). Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv preprint arXiv:2305.18290.
    3. Qwen Team. (2024). Qwen1.5: An Open Source AI Model by Alibaba. https://github.com/QwenLM/Qwen
    4. Firefly Team. (2024). Firefly: An Open-source One-stop Large Language Model Training Framework. https://github.com/YeungNLP/firefly