如果你喜欢这个项目,请给这个仓库点一颗★星以示支持!🤩
2024年1月15日——在回顾Spago的旅程时,我对它带给我的丰富经验充满了感激。通过Spago掌握Go并重新学习深度学习的基础知识,非常有意义。Spago的独特功能,尤其是它的异步计算图和注重优雅代码,使其成为一个非凡的项目。我们的目标是用Go创建一个简约的机器学习框架,通过创建独立的可执行文件来取消对生产环境中Python的依赖。Spago成功地在具有挑战性的生产环境中支持了我的多个项目。
然而,将Spago提升到能够有效竞争的水平,在这个迅速发展的涉及大量GPU计算的“人工智能领域”中,需要大量的投入。同时,Spago所努力实现的愿景,现在正在由Rust语言的Candle项目令人印象深刻地实现。由于我无法充分关注Spago,且缺少支持性维护团队,我做出了一个务实的决定,暂时暂停这个项目。
我非常感激Spago带给我的旅程以及支持它的社区。随着我们继续探索充满变化的机器学习领域,我期待未来的激动人心的发展。
致敬,
Matteo Grella
Spago是一个用纯Go编写的机器学习库,旨在支持自然语言处理中的相关神经网络架构。
Spago是自包含的,它使用自己的轻量级计算图进行训练和推理,从头到尾都易于理解。
它提供:
- 动态定义执行的自动微分
- 前馈层(线性,高速公路,卷积...)
- 循环层(LSTM,GRU,BiLSTM...)
- 注意力层(自注意力,多头注意力...)
- 梯度下降优化器(Adam,RAdam,RMS-Prop,AdaGrad,SGD)
- 兼容Gob的神经模型用于序列化
如果你对NLP相关功能感兴趣,请务必探索Cybertron包!
使用须知
要求:
克隆这个仓库或者获取这个库:
go get -u github.com/nlpodyssey/spago
入门指南
一个好的开始是查看内置神经模型的实现,例如LSTM。
示例1
这里有一个如何计算两个变量之和的示例:
package main
import (
"fmt"
"log"
"github.com/nlpodyssey/spago/ag"
"github.com/nlpodyssey/spago/mat"
)
func main() {
// 定义张量元素的类型
type T = float32
// 创建一个标量类型的新节点
a := mat.Scalar(T(2.0), mat.WithGrad(true)) // 创建另一个标量类型的新节点
b := mat.Scalar(T(5.0), mat.WithGrad(true)) // 创建加法运算符(实际计算在这里执行)
c := ag.Add(a, b)
// 打印结果
fmt.Printf("c = %v (float%d)\n", c.Value(), c.Value().Item().BitSize())
c.AccGrad(mat.Scalar(T(0.5)))
if err := ag.Backward(c); err != nil {
log.Fatalf("error during Backward(): %v", err)
}
fmt.Printf("ga = %v\n", a.Grad())
fmt.Printf("gb = %v\n", b.Grad())
}
输出:
c = [7] (float32)
ga = [0.5]
gb = [0.5]
示例2
这里是感知器公式的一个简单实现:
package main
import (
"fmt"
. "github.com/nlpodyssey/spago/ag"
"github.com/nlpodyssey/spago/mat"
)
func main() {
x := mat.Scalar(-0.8)
w := mat.Scalar(0.4)
b := mat.Scalar(-0.2)
y := Sigmoid(Add(Mul(w, x), b))
fmt.Printf("y = %0.3f\n", y.Value().Item())
}
贡献
如果你觉得有些东西缺失或可以改进,请打开issue和pull request。
要开始贡献,请查看贡献指南。
联系方式
我们非常鼓励你创建issue,因为这将有助于社区的成长。然而,如果你更喜欢私下与我们沟通,请随时通过电子邮件联系Matteo Grella,提出你的问题或意见。