共享变量(shared variable)是实现机器学习算法参数更新的重要机制。shared函数会返回共享变量。这种变量的值在多个函数可直接共享。可以用符号变量的地方都可以用共享变量。但不同的是,共享变量有一个内部状态的值,这个值可以被多个函数共享。它可以存储在显存中,利用GPU提高性能。我们可以使用get_value和set_value方法来读取或者修改共享变量的值,使用共享变量实现累加操作。
import theano import theano.tensor as T from theano import shared import numpy as np #定义一个共享变量,并初始化为0 state = shared(0) inc = T.iscalar('inc') accumulator = theano.function([inc], state, updates=[(state, state+inc)]) # 打印state的初始值 print(state.get_value()) accumulator(1) # 进行一次函数调用 # 函数返回后,state的值发生了变化 print(state.get_value())
这里state是一个共享变量,初始化为0,每次调用accumulator(),state都会加上inc。共享变量可以像普通张量一样用于符号表达式,另外,它还有自己的值,可以直接用.get_value()和.set_value()方法来访问和修改。
上述代码引入了函数中的updates参数。updates参数是一个list,其中每个元素是一个元组(tuple),这个tuple的第一个元素是一个共享变量,第二个元素是一个新的表达式。updatas中的共享变量会在函数返回后更新自己的值。updates的作用在于执行效率,updates多数时候可以用原地(in-place)算法快速实现,在GPU上,Theano可以更好地控制何时何地给共享变量分配空间,带来性能提升。最常见的神经网络权值更新,一般会用update实现。