重演 Llama3 抢坑狂潮?首个中文社区版的 Gemma-2 来了

整理 | 王启隆

出品 | AI 科技大本营(ID:rgznai100)

不久前,我们报道了谷歌旗下的最新开源模型 Gemma 第二代 Gemma-2 发布,目前二代 Gemma 没有一代的 2B(20 亿)参数端侧模型,还只有两个型号:9B 和 27B。前者可以在游戏显卡上面跑,后者则需要 Google Cloud TPU 主机或是 A100/H100 这样的 AI 显卡。

四天过去了,Gemma-2 并没有复刻 Llama-3 当年的火爆场景 —— 当时的 Llama-3 在第四天已经有了 1,000 多个变种,还出现了各式各样的中文微调版本,比如 Unichat-llama3-Chinese、llama3-Chinese-chat、llama3-chinese、llama3-8b-Chinese-ft……每一位开发者都在争抢第一波的热度,甚至还有清华系的大学研究团队跟进,颇有当年 QQ 空间的“抢车位”游戏的感觉。

009838e974af8347a34462aa3fca9ee3.png

再看看 Gemma-2 及其衍生模型的下载量,和初代 Gemma 的 2B 端侧模型 30 万的下载量更是完全没法比。

7b4812dea8379d488ef416c53f74d188.jpeg

8a03949959edabb803142661d13e8544.png

幸运的是,这个现象终于要缓解了,清华大学的人工智能博士王慎执与北京航空航天大学的人工智能博士郑耀威在今天下午(北京时间 13 点)正式开源了全球第一个专为中文和英文用户量身定制的 Gemma-2 模型 Gemma-2-9B-Chinese-Chat,该模型经过超 10 万条偏好对的精细调优,在处理中文提示方面表现出色,还显著提升了逻辑推理、编程、数学及写作能力。

e588c4e8f1bb690e2449343453c28dc6.png

模型链接:https://huggingface.co/shenzhi-wang/Gemma-2-9B-Chinese-Chat

4bb9e64a2ef208fe7e212ffcc7d8c27a.png

值得一提的是,王慎执博士先前也发布过 Llama3-8B-Chinese-Chat, Llama3-70B-Chinese-Chat 和 Mistral-7B-v0.3-Chinese-Chat 几款开源模型,其中 Llama3-8B 的两款模型广受好评,这在当时是全球第一个基于 Meta-Llama-3-8B-Instruct 模型通过 ORPO 专门针对中文进行微调的中文聊天模型,并在 Hugging Face 上爆火:

82e79286f6bdf34e3870c04c68df2b93.png

311ffeb8941b8c99aba286290834a4f0.png

微调原理

在深入探索 Gemma-2-9B-Chinese-Chat 的技术核心与影响之前,我们首先回顾其构建基础:Gemma 2 经过了架构的重新设计,专注于提升推理效率和性能。这种优化不仅仅体现在计算速度上,还表现在它能够在更广泛的硬件平台上实现高效运行,从高端 GPU 到普通游戏笔记本,都能展现出惊人的推理速度,极大地拓宽了模型的应用范围。

具体举例来说,Gemma 2 的一个重要改进在于其在单一高端硬件(如 NVIDIA H100 Tensor Core GPU 或 TPU主机)上就能实现全精度高效运行,这意味着即使是在 270 亿参数规模下,也能大幅降低部署成本,使得高性能 AI 模型的应用变得更加经济实惠。而放在这个 9B 模型上,更是用 3070 等游戏显卡即可运行。

Gemma-2-9B-Chinese-Chat 在此基础上进一步,不仅针对中英文混合场景进行了优化,还通过集成 ORPO 算法等先进技术,显著提升了模型的实用性与效率。

1d69be9c9286a1acedae9553623f5955.png

微调是机器学习领域中提升模型特定任务性能的关键步骤,Gemma-2-9B-Chinese-Chat 的微调过程尤其注重了对中英文双语能力的增强。不同于简单的翻译任务,该模型旨在实现两种语言间的自然对话与理解,要求模型不仅要准确翻译,还要理解语境、文化差异及语言习惯。

ORPO 算法(Odds Ratio Preference Optimization)在此过程中扮演了核心角色。此算法灵感来源于信息检索和统计学,通过计算偏好输出与非偏好输出的概率比值,引导模型学习更符合人类偏好的表达方式。ORPO 的一个关键优势在于,它允许在没有直接偏好标签的环境下进行优化,这意味着模型可以依据相对模糊的反馈(如用户满意度调查、互动次数等)自我调整,达到更高的个性化和用户满意度。

此前,Google 的 T5(Text-to-Text Transfer Transformer)模型,就展示了预训练模型在多种文本生成和理解任务上的广泛适用性;Facebook 的RoBERTa(Robustly Optimized BERT Pretraining Approach)通过改进训练策略,提高了模型的泛化能力。这些工作共同推动了大规模语言模型向更高效、更灵活的方向发展。

在双语模型领域,也有诸多研究值得关注,如 XLM-R(Cross-lingual Language Model - Roberta)通过在多种语言的文本上进行预训练,实现了跨语言的理解和生成能力。

19f9c102c6e747b0af6e52b0da61b9c8.png

生成质量

作者在模型下载页面展示了 Gemma-2-9B-Chinese-Chat 生成的一些示例,包括角色扮演函数调用数学安全写作编码几大类别,还有专门用“弱智吧”问题提问的案例。我们选几样进行展示:

角色扮演

6ed3d7f9ed9e64f0a9489f3feb322fe6.png

Gemma-2-9B-Chinese-Chat 不仅能很好地扮演鲁智深的角色,还能继承上一轮对话保持人设进行聊天,效果还是不错的。

1a54bb50c0238199a2a31486811025d2.png

另外,别忘了这也是一个针对中英文混合场景的模型,对英文同样进行了微调,可以完成英文写诗之类的操作。

数学

fc24b00f44da0960258caf7364476fd6.png

经典的鸡兔同笼问题。值得一提的是,三个月前参数差不多的 Llama-3-8B-Instruct 在很多博主测试鸡兔同笼问题时遭遇了“翻车”。

代码

这一轮便交由屏幕前的你进行批判了,以下是问答全文。

提问:用 C++ 实现 KMP 算法,并加上中文注释。

Gemma-2-9B-Chinese-Chat:KMP 算法是一种在字符串匹配过程中,通过预处理计算出每个子串的最长前后缀来优化字符串匹配过程的算法。以下是一个使用 C++ 实现的 KMP 算法的例子,并且附带中文注释。

#include <iostream>                                  
#include <vector>                                        
                                                     
// KMP算法核心函数,用于计算文本模式前缀的最长前后缀长度                                                           
std::vector<int> computeLPSArray(const std::string &pattern) {                                                     
    int M = pattern.length();                        
    std::vector<int> lps(M, 0); // lps[i]表示pattern[0...i-1]的最长前后缀长度                                      
                                                     
    int length = 0; // 之前匹配的长度                
    int i = 1; // 遍历模式串的位置                   
                                                     
    while (i < M) {                                  
        if (pattern[i] == pattern[length]) {         
            length++;                                
            lps[i] = length;                         
            i++;                                     
        } else {                                     
            if (length != 0) {                       
                length = lps[length - 1];                
            } else {                                 
                lps[i] = 0;                                                                                
                i++;                                 
            }                                        
        }                                            
    }                                                
    return lps;                                      
}                                                        
                                                     
// 匹配字符串,返回匹配次数                          
int kmpSearch(const std::string &text, const std::string &pattern, std::vector<int> lps) {                         
    int N = text.length();                           
    int M = pattern.length();                        
    int i = 0;                                                                                                                                                                                                                         
    int j = 0;                                       
    int count = 0; // 匹配次数                                                                                                                                                                                         
                                                     
    while (i < N) {                                  
        if (text[i] == pattern[j]) {                 
            i++;                                     
            j++;                                     
        }                                                
                                                     
        if (j == M) {                                
            count++;                                 
            j = lps[j - 1];                                                                                
        }                                            
    }                                                                                                      
    return count;                                    
}                                                    


int main() {                                             
    std::string text = "AABAACAADAABAAABAA";             
    std::string pattern = "AABA";                        
    std::vector<int> lps = computeLPSArray(pattern);                                                               
    int count = kmpSearch(text, pattern, lps);           
    std::cout << "匹配次数为: " << count << std::endl;                                                             
    return 0;                                            
}

你觉得 Gemma-2-9B-Chinese-Chat 的表现如何?最后,再次附上链接,期待接下来还有更多的 Gemma-2 中文微调模型问世,再演 Llama 3 的开源热潮。

模型链接:https://huggingface.co/shenzhi-wang/Gemma-2-9B-Chinese-Chat

290c84d734292ec4747022f221dd18d2.gif

由 CSDN 和 Boolan 联合主办的「2024 全球软件研发技术大会(SDCon)」将于 7 月 4 -5 日在北京威斯汀酒店举行。

由世界著名软件架构大师、云原生和微服务领域技术先驱 Chris Richardson 和 MIT 计算机与 AI 实验室(CSAIL)副主任,ACM Fellow Daniel Jackson 领衔,华为、BAT、微软、字节跳动、京东等技术专家将齐聚一堂,共同探讨软件开发的最前沿趋势与技术实践。

大会官网:http://sdcon.com.cn/(可点击阅读原文直达)

38cec592a6d34cad88c3f8d7c7f93d95.png

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值