This experimental case study will demonstrate that IS can successfully learn in a changing environment where the tasks to be solved become more and more difficult over time (inductive transfer).
Task sequence. Our system is exposed to a sequence of more and more
complex function approximation problems. The functions to be learned
are
;
;
;
;
.
Trials. The system's single life is decomposable into
successive trials
,
, ...,
(but the learner has no a priori concept of a trial). The
-th trial lasts from discrete
time step
until discrete time step
, where
(system birth) and
(system death). In a given trial
we first select a function
.
As the trial number increases, so does the probability of selecting a
more complex function. In early trials the focus is on
. In late
trials the focus is on
. In between there is a gradual shift in
task difficulty: using a function pointer
(initially 1) and an
integer counter
(initially 100), in trial
we select
with probability
, and
with
probability
. If the reward acceleration during
the most recent two trials exceeds a certain threshold (0.05), then
is decreased by 1. If
becomes 0 then
is increased by 1,
and
is reset to 100. This is repeated until
. From
then on,
is always selected.
Once is selected, randomly generated real values
,
and
are put into work cells 0, 1, 2, respectively. The contents of an
arbitrarily chosen work cell (we always use cell 6) are interpreted as
the system's response. If
fulfills the condition
, then the trial ends and the current reward becomes
; otherwise the current reward is 0.0.
Instructions. Instruction sequences can be composed from the
following primitive instructions (compare section 4.1):
Add(), Sub(
),
Mul(
),
Mov(
), IncProb(
),
EndSelfMod(
), JumpHome().
Each instruction occupies 4 successive program cells (some of them unused
if the instruction has less than 3 parameters). We use
.
Evaluation Condition. SSA is called after each 5th consecutive
non-zero reward signal after the end of each SMS, i.e., we set
.
Huge search space. Given the primitives above, random search would
require about trials on average to find a solution for
-- the search space is huge. The gradual shift in task complexity,
however, helps IS to learn
much faster, as will be seen below.
Results. After about
instruction cycles
(ca.
trials), the system is able to compute
almost
perfectly, given arbitrary real-valued inputs. The corresponding
speed-up factor over (infeasible) random or exhaustive search is about
-- compare paragraph ``Huge search space'' above. The solution
(see Figure 5) involves 21 strongly modified probability
distributions of the policy (after learning, the correct instructions
had extreme probability values). At the end, the most probable code is
given by the following integer sequence:
1 2 1 6 1 0 6 6 2 6
6 6 2 6 6 6 2 6 6 6 4
...
The corresponding ``program'' and the (very high)
probabilities of its instructions and parameters
are shown in Table 4.
![]() |
Evolution of self-modification frequencies. During its life
the system generates a lot of self-modifications to compute the
strongly modified policy. This includes changes of the probabilities of
self-modifications. It is quite interesting (and also quite difficult) to
find out to which extent the system uses self-modifying instructions to
learn how to use self-modifying instructions. Figure 6 gives
a vague idea of what is going on by showing a typical plot of the frequency
of IncProb instructions during system life (sampled at intervals of
basic cycles). Soon after its birth, the system found it useful to
dramatically increase the frequency of IncProb; near its death (when
there was nothing more to learn) it significantly reduced this frequency.
This is reminiscent of Schwefel's work (1974) on
self-adjusting mutation rates. One major novelty is
the adaptive, highly non-uniform distribution of self-modifications
on ``promising'' individual policy components.
![]() |
Stack evolution. The temporary ups and downs of the stack reflect
that as the tasks change, the system selectively keeps still useful
old modifications (corresponding to information conveyed by previous
tasks that is still valuable for solving the current task), but deletes
modifications that are too much tailored to previous tasks. In the end,
there are only about 200 stack entries corresponding to only 200 valid probability modifications - this is a small number compared to
the about self-modifications executed during system life.