在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):mstksg/backprop开源软件地址(OpenSource Url):https://github.com/mstksg/backprop开源编程语言(OpenSource Language):Haskell 100.0%开源软件介绍(OpenSource Introduction):backpropAutomatic heterogeneous back-propagation. Write your functions to compute your result, and the library will automatically generate functions to compute your gradient. Differs from ad by offering full heterogeneity -- each intermediate step and the resulting value can have different types (matrices, vectors, scalars, lists, etc.). Useful for applications in differentiable programming and deep learning for creating and training numerical models, especially as described in this blog post on a purely functional typed approach to trainable models. Overall, intended for the implementation of gradient descent and other numeric optimization techniques. Comparable to the python library autograd. Currently up on hackage, with haddock documentation! However, a proper library introduction and usage tutorial is available here. See also my introductory blog post. You can also find help or support on the gitter channel. If you want to provide backprop for users of your library, see this guide to equipping your library with backprop. MNIST Digit Classifier ExampleMy blog post introduces the concepts in this library in the context of training a handwritten digit classifier. I recommend reading that first. There are some literate haskell examples in the source, though (rendered as pdf here), which can be built (if stack is installed) using: $ ./Build.hs exe There is a follow-up tutorial on using the library with more advanced types, with extensible neural networks a la this blog post, available as literate haskell and also rendered as a PDF. Brief example(This is a really brief version of the documentation walkthrough and my blog post) The quick example below describes the running of a neural network with one
hidden layer to calculate its squared error with respect to target Let's make a data type to store our parameters, with convenient accessors using lens: import Numeric.LinearAlgebra.Static.Backprop
data Network = Net { _weight1 :: L 20 100
, _bias1 :: R 20
, _weight2 :: L 5 20
, _bias2 :: R 5
}
makeLenses ''Network ( "Running" a network on an input vector might look like this: runNet net x = z
where
y = logistic $ (net ^^. weight1) #> x + (net ^^. bias1)
z = logistic $ (net ^^. weight2) #> y + (net ^^. bias2)
logistic :: Floating a => a -> a
logistic x = 1 / (1 + exp (-x)) And that's it! We can "run" it using evalBP2 runNet :: Network -> R 100 -> R 5 If we write a function to compute errors: squaredError target output = error `dot` error
where
error = target - output we can "test" our networks: netError target input net = squaredError (auto target)
(runNet net (auto input)) This can be run, again: evalBP (netError myTarget myVector) :: Network -> Double Now, we just wrote a normal function to compute the error of our network. With the backprop library, we now also have a way to compute the gradient, as well! gradBP (netError myTarget myVector) :: Network -> Network Now, we can perform gradient descent! gradDescent
:: R 100
-> R 5
-> Network
-> Network
gradDescent x targ n0 = n0 - 0.1 * gradient
where
gradient = gradBP (netError targ x) n0 Ta dah! We were able to compute the gradient of our error function, just by only saying how to compute the error itself. For a more fleshed out example, see the documentaiton, my blog post and the MNIST tutorial (also rendered as a pdf) Benchmarks and PerformanceHere are some basic benchmarks comparing the library's automatic differentiation process to "manual" differentiation by hand. When using the MNIST tutorial as an example: Here we compare:
We can see that simply running the network and functions (using As for computing gradients, there exists some associated overhead, from three main sources. Of these, the building of the computational graph and the Wengert Tape wind up being negligible. For more information, see a detailed look at performance, overhead, and optimization techniques in the documentation. Note that the manual and hybrid modes almost overlap in the range of their random variances. Comparisonsbackprop can be compared and contrasted to many other similar libraries with some overlap:
See documentation for a more detailed look. Todo
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论