diff --git a/crf-chain2-tiers.cabal b/crf-chain2-tiers.cabal
--- a/crf-chain2-tiers.cabal
+++ b/crf-chain2-tiers.cabal
@@ -1,5 +1,5 @@
 name:               crf-chain2-tiers
-version:            0.2.0
+version:            0.2.1
 synopsis:           Second-order, tiered, constrained, linear conditional random fields
 description:
     The library provides implementation of the second-order, linear
@@ -31,7 +31,7 @@
       , monad-codec             >= 0.2          && < 0.3
       , data-lens               >= 2.10.4       && < 2.11
       , comonad                 >= 4.0          && < 4.1
-      , logfloat
+      , logfloat                >= 0.12.1       && < 0.13
       , parallel
       , sgd                     >= 0.3.2 && < 0.4
 
diff --git a/src/Data/CRF/Chain2/Tiers.hs b/src/Data/CRF/Chain2/Tiers.hs
--- a/src/Data/CRF/Chain2/Tiers.hs
+++ b/src/Data/CRF/Chain2/Tiers.hs
@@ -15,6 +15,7 @@
 
 -- * Tagging
 , tag
+, marginals
 
 -- * Modules
 , module Data.CRF.Chain2.Tiers.Dataset.External
@@ -184,3 +185,11 @@
     onWords xs =
         [ unJust codec word x
         | (word, x) <- zip sent xs ]
+
+
+-- | Tag labels with marginal probabilities.
+marginals :: (Ord a, Ord b) => CRF a b -> Sent a b -> [[Double]]
+marginals CRF{..}
+    = map (map LogFloat.fromLogFloat)
+    . I.marginals model
+    . encodeSent codec
diff --git a/src/Data/CRF/Chain2/Tiers/Inference.hs b/src/Data/CRF/Chain2/Tiers/Inference.hs
--- a/src/Data/CRF/Chain2/Tiers/Inference.hs
+++ b/src/Data/CRF/Chain2/Tiers/Inference.hs
@@ -2,7 +2,7 @@
 
 module Data.CRF.Chain2.Tiers.Inference
 ( tag
-, probs
+-- , probs
 , marginals
 , expectedFeatures
 , accuracy
@@ -116,19 +116,21 @@
     let ixs = tagIxs crf sent
     in  [lbAt x i | (x, i) <- zip (V.toList sent) ixs]
 
--- | Tag potential labels with corresponding probabilities.
-probs :: Model -> Xs -> [[L.LogFloat]]
-probs crf sent =
-    let alpha = forward maximum crf sent
-        beta = backward maximum crf sent
-        normalize xs =
-            let d = - sum xs
-            in map (*d) xs
-        m1 k x = maximum
-            [ alpha k x y * beta (k + 1) x y
-            | y <- lbIxs sent (k - 1) ]
-    in  [ normalize [m1 i k | k <- lbIxs sent i]
-        | i <- [0 .. V.length sent - 1] ]
+-- -- | Tag labels with corresponding probabilities.
+-- TODO: doesn't work, crashes with "Data.Number.LogFloat.negate:
+-- argument out of range" for some reason.
+-- probs :: Model -> Xs -> [[L.LogFloat]]
+-- probs crf sent =
+--     let alpha = forward maximum crf sent
+--         beta = backward maximum crf sent
+--         normalize xs =
+--             let d = - sum xs
+--             in map (*d) xs
+--         m1 k x = maximum
+--             [ alpha k x y * beta (k + 1) x y
+--             | y <- lbIxs sent (k - 1) ]
+--     in  [ normalize [m1 i k | k <- lbIxs sent i]
+--         | i <- [0 .. V.length sent - 1] ]
 
 -- | Tag potential labels with marginal probabilities.
 marginals :: Model -> Xs -> [[L.LogFloat]]
