![11.png](https://static.golangjob.cn/231115/2fa6a87a46fe2177ec13c4335ec741bf.png)
从0到1训练自己的大模型,揭密Chat背后的技能与应用,完结11章,源码+PPT下载!
那么,什么是大模型呢?
大模型是指具有大规模参数和复杂计算结构的机器学习模型。本文从大模型的基本概念出发,对大模型领域容易混淆的相关概念进行区分,并就大模型的发展历程、特点和分类、泛化与微调进行了详细解读,供大家在了解大模型基本知识的过程中起到一定参考作用。
那么,大模型和小模型有什么区别?
小模型通常指参数较少、层数较浅的模型,它们具有轻量级、高效率、易于部署等优点,适用于数据量较小、计算资源有限的场景,例如移动端应用、嵌入式设备、物联网等。
而当模型的训练数据和参数不断扩大,直到达到一定的临界规模后,其表现出了一些未能预测的、更复杂的能力和特性,模型能够从原始训练数据中自动学习并发现新的、更高层次的特征和模式,这种能力被称为“涌现能力”。而具备涌现能力的机器学习模型就被认为是独立意义上的大模型,这也是其和小模型最大意义上的区别。
相比小模型,大模型通常参数较多、层数较深,具有更强的表达能力和更高的准确度,但也需要更多的计算资源和时间来训练和推理,适用于数据量较大、计算资源充足的场景,例如云端计算、高性能计算、人工智能等。
基于负采样的softmax计算
现在随着GPU计算性能的增加,几万个类别已经不算太大
所以现在LM一般不使用这个技巧了。
几万类别ok,但几百万、几千万类别呢?
人脸识别。为什么现在很难基于人脸去直接识别顾客的基本信息,非得先录入。
现在基本都是人脸匹配,只是基于已经有图片进行查找,而不是直接去分类。
就是因为真正去分类类别数量太大,如果是全国范围,就是14亿的类别。
树型结构的本质是二叉树,在计算机(无论算法还是工程)领域,应用案例随处可见。
结构体也是开发中使用频率极高的一种数据类型,本节我们就来看看结构的一些重要知识点。
我们先看下面的例子:
package main
import (
"log"
"unsafe"
)
type St struct {
f1 int8
f2 int16
f3 int64
}
type St1 struct {
f1 int8
f3 int64
f2 int16
}
func init() {
log.SetFlags(log.Lshortfile)
}
func main() {
st := St{}
st1 := St1{}
log.Println(unsafe.Sizeof(st))
log.Println(unsafe.Sizeof(st1))
log.Println(unsafe.Sizeof(int8(1)))
log.Println(unsafe.Sizeof(int16(1)))
log.Println(unsafe.Sizeof(int64(1)))
}
我们可以理解为切片数据的一个快捷方式,其地址跟原始切片是一致的,所以在函数内对切片进行修改会影响到原始切片的值。但是需要注意的是,我们在函数内对切片进行重新赋值会改变函数内实参的数据地址的指向:
我们可以通过下面的代码来理解:
package main
import (
"log"
"reflect"
)
func init() {
log.SetFlags(log.Lshortfile)
}
func main() {
//s := []int{1, 2, 3}
s := make([]int, 0, 6)
s = append(s, 1, 2, 3)
log.Printf("s:%p", s)
assignSlice(s)
chageSliceItem(s)
log.Println("s:", s)
appendSliceItem(s)
log.Println("s:", s)
//通过反射改变切片的长度
reflect.ValueOf(&s).Elem().SetLen(4)
log.Println("s:", s)
}
func assignSlice(param []int) {
log.Printf("assignSlice param:%p", param)
s1 := []int{1, 2, 3}
//param与函数外的切片s解除引用关系,同时param将指向s1的数据地址
param = s1
log.Printf("assignSlice param:%p", param)
param[0] = 5
}
// 会影响到函数外切片的值
func chageSliceItem(param []int) {
param[0] = 4
}
func appendSliceItem(param []int) {
log.Printf("appendSliceItem param addr:%p cap:%d", param, cap(param))
//发生扩容,指向的数据地址发生了变化(发生了copy),所以不会影响到函数的切片
param = append(param, 5)
log.Printf("appendSliceItem param addr:%p cap:%d", param, cap(param))
}
Jackson开发方法
Jackson开发方法是一种面向对象的软件开发方法,它的核心是通过对问题域的分析和描述来构建类图和类之间的关系图。Jackson开发方法强调在开发过程中使用类图和流程图来描述软件系统的结构和行为,并通过使用设计模式和框架来提高代码的可重用性和可维护性。
与CMM模型、结构化开发方法和面向对象开发方法相比,Jackson开发方法更注重软件系统的分析和设计,能够更好地描述软件系统的结构和行为。但是,它对需求的分析和描述可能不够全面和详细,需要结合其他方法进行补充和完善。
综上所述,CMM模型、结构化开发方法和面向对象开发方法各有其优缺点,需要根据具体的项目需求和情况进行选择。UML是标准的建模语言,可以用于各种软件开发方法的建模。Jackson开发方法是面向对象的软件开发方法的一种,与其他方法可以相互补充和完善。
大模型开发工具与开源社区,Colossal-AI 再次迭代,提供开箱即用的 8 到 512 卡 LLaMA2 训练、微调、推理方案,对 700 亿参数训练加速 195%,并提供一站式云平台解决方案,极大降低大模型开发和落地应用成本。
有疑问加站长微信联系(非本文作者)