Узлы смещения в примере GEKKO ANN - PullRequest
2 голосов
/ 18 апреля 2019

В примере ANN TCLab B веб-страницы курса динамической оптимизации (https://apmonitor.com/do/index.php/Main/TCLabB), имеет ли узел смещения для каждого слоя заданный в сценарии? Пожалуйста, дайте мне знать, какие строки представляют узлы смещения. Если этоне обязательно, пожалуйста, объясните причину. Спасибо.

# -------------------------------------
# build neural network
# -------------------------------------

nin = 2  # inputs
n1 = 2   # hidden layer 1 (linear)
n2 = 2   # hidden layer 2 (nonlinear)
n3 = 2   # hidden layer 3 (linear)
nout = 2 # outputs

# Initialize gekko models
train = GEKKO() 
dyn   = GEKKO()
model = [train,dyn]

for m in model:
    # use APOPT solver
    m.options.SOLVER = 1

    # input(s)
    m.inpt = [m.Param() for i in range(nin)]

    # layer 1 (linear)
    m.w1 = m.Array(m.FV, (nout,nin,n1))
    m.l1 = [[m.Intermediate(sum([m.w1[k,j,i]*m.inpt[j] \
            for j in range(nin)])) for i in range(n1)] \
            for k in range(nout)]

    # layer 2 (tanh)
    m.w2 = m.Array(m.FV, (nout,n1,n2))
    m.l2 = [[m.Intermediate(sum([m.tanh(m.w2[k,j,i]*m.l1[k][j]) \
            for j in range(n1)])) for i in range(n2)] \
            for k in range(nout)]

    # layer 3 (linear)
    m.w3 = m.Array(m.FV, (nout,n2,n3))
    m.l3 = [[m.Intermediate(sum([m.w3[k,j,i]*m.l2[k][j] \
            for j in range(n2)])) for i in range(n3)] \
            for k in range(nout)]

    # outputs
    m.outpt = [m.CV() for i in range(nout)]
    m.Equations([m.outpt[k]==sum([m.l3[k][i] for i in range(n3)]) \
                 for k in range(nout)])

    # flatten matrices
    m.w1 = m.w1.flatten()
    m.w2 = m.w2.flatten()
    m.w3 = m.w3.flatten()

1 Ответ

2 голосов
/ 22 апреля 2019

Вот несколько причин, по которым вы можете рассмотреть возможность добавления узлов смещения:

  • Смещение похоже на член перехвата в линейной регрессии и полезно для настройки входов или внутренних узлов для достижения лучшего соответствия.
  • Термины смещения - это дополнительные параметры, которые решатель может использовать для минимизации функции потерь (целевая функция).

Некоторые причины, по которым вы не хотите добавлять узлы смещения:

  • Они создают дополнительные параметры, которые могут создавать дополнительные проблемы экстраполяции из-за чрезмерной параметризации и чрезмерной подгонки
  • Смещение может сдвигать входные или внутренние узлы вверх или вниз до такой степени, что в процессе итерации решателя возникают исчезающие градиенты. Это приводит к частям модели, которые могут больше не способствовать дифференциации прогнозов.
  • Сети глубокого обучения могут компенсировать отсутствие условий смещения, регулируя средний выходной сигнал.

Это также может помочь масштабировать входы и выходы между 0 и 1, особенно если ноль для входа будет равен нулю для выхода. С помощью этого преобразования вы масштабировали переменные так, чтобы член смещения был равен нулю, и вы пытаетесь смоделировать изменение с нуля с помощью функций активации. Этот метод используется в динамическом моделировании, где вы преобразуете уравнения в форму «переменной отклонения», где номинальные или установившиеся значения установлены на ноль. Уравнения отслеживают отклонение от этой номинальной нулевой начальной точки.

Вот несколько дополнительных предложений по этой теме: обсуждение 1 и обсуждение 2 .

Вы можете добавить термины смещения в модель Gekko, как показано в примере 7 из 18 руководств по Gekko . Термин смещения w2b. Точно так же вы можете добавить его для упомянутой проблемы, хотя вы можете попробовать его только для первого (входного) слоя как w1a и w1b.

for m in model:
    # use APOPT solver
    m.options.SOLVER = 1

    # input(s)
    m.inpt = [m.Param() for i in range(nin)]

    # layer 1 (linear)
    m.w1a = m.Array(m.FV, (nout,nin,n1))
    m.w1b = m.Array(m.FV, (nout,nin,n1))
    m.l1 = [[m.Intermediate(sum([m.w1a[k,j,i]*m.inpt[j] + m.w1b[k,j,i] \
            for j in range(nin)])) for i in range(n1)] \
            for k in range(nout)]

    # layer 2 (tanh)
    m.w2a = m.Array(m.FV, (nout,n1,n2))
    m.w2b = m.Array(m.FV, (nout,n1,n2))
    m.l2 = [[m.Intermediate(sum([m.tanh(m.w2a[k,j,i]*m.l1[k][j]) + m.w2b[k,j,i] \
            for j in range(n1)])) for i in range(n2)] \
            for k in range(nout)]

    # layer 3 (linear)
    m.w3a = m.Array(m.FV, (nout,n2,n3))
    m.w3b = m.Array(m.FV, (nout,n2,n3))
    m.l3 = [[m.Intermediate(sum([m.w3a[k,j,i]*m.l2[k][j] + m.w3b[k,j,i] \
            for j in range(n2)])) for i in range(n3)] \
            for k in range(nout)]

    # outputs
    m.outpt = [m.CV() for i in range(nout)]
    m.Equations([m.outpt[k]==sum([m.l3[k][i] for i in range(n3)]) \
                 for k in range(nout)])

    # flatten matrices
    m.w1a = m.w1.flatten()
    m.w2a = m.w2.flatten()
    m.w3a = m.w3.flatten()
    m.w1b = m.w1.flatten()
    m.w2b = m.w2.flatten()
    m.w3b = m.w3.flatten()
...