grenade-0.1.0: src/Grenade/Layers/Logit.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-|
Module : Grenade.Layers.Logit
Description : Sigmoid nonlinear layer
Copyright : (c) Huw Campbell, 2016-2017
License : BSD2
Stability : experimental
-}
module Grenade.Layers.Logit (
Logit (..)
) where
import Data.Serialize
import Data.Singletons
import Grenade.Core
-- | A Logit layer.
--
-- A layer which can act between any shape of the same dimension, perfoming an sigmoid function.
-- This layer should be used as the output layer of a network for logistic regression (classification)
-- problems.
data Logit = Logit
deriving Show
instance UpdateLayer Logit where
type Gradient Logit = ()
runUpdate _ _ _ = Logit
createRandom = return Logit
instance (a ~ b, SingI a) => Layer Logit a b where
type Tape Logit a b = S a
runForwards _ a = (a, logistic a)
runBackwards _ a g = ((), logistic' a * g)
instance Serialize Logit where
put _ = return ()
get = return Logit
logistic :: Floating a => a -> a
logistic x = 1 / (1 + exp (-x))
logistic' :: Floating a => a -> a
logistic' x = logix * (1 - logix)
where
logix = logistic x