Fast convergence of cerebellar learning (Luque et al. 2015)

 Download zip file 
Help downloading and running models
Accession:150225
The cerebellum is known to play a critical role in learning relevant patterns of activity for adaptive motor control, but the underlying network mechanisms are only partly understood. The classical long-term synaptic plasticity between parallel fibers (PFs) and Purkinje cells (PCs), which is driven by the inferior olive (IO), can only account for limited aspects of learning. Recently, the role of additional forms of plasticity in the granular layer, molecular layer and deep cerebellar nuclei (DCN) has been considered. In particular, learning at DCN synapses allows for generalization, but convergence to a stable state requires hundreds of repetitions. In this paper we have explored the putative role of the IO-DCN connection by endowing it with adaptable weights and exploring its implications in a closed-loop robotic manipulation task. Our results show that IO-DCN plasticity accelerates convergence of learning by up to two orders of magnitude without conflicting with the generalization properties conferred by DCN plasticity. Thus, this model suggests that multiple distributed learning mechanisms provide a key for explaining the complex properties of procedural learning and open up new experimental questions for synaptic plasticity in the cerebellar network.
Reference:
1 . Luque NR, Garrido JA, Carrillo RR, D'Angelo E, Ros E (2014) Fast convergence of learning requires plasticity between inferior olive and deep cerebellar nuclei in a manipulation task: a closed-loop robotic simulation. Front Comput Neurosci 8:97 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Cerebellum;
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: Simulink;
Model Concept(s): STDP;
Implementer(s): Garrido, Jesus A [jesus.garrido at unipv.it]; Luque, Niceto R. [nluque at ugr.es];
%*****************************************************************************************
%           Launch m file for Simulink Cerebellar Abstract with an applied external Force 
%****************************************************************************************   

%% Initializing parameters
% cleaning all the possible variables 
     clear all
     close all
     % Simulation  parameters of the simulink file 
     TrajectoryTime=1;%1sec
     TimeStep=0.002; % Step Size
     SimulationTime=10; %Total simulation time
     
     % This is for storing into a File all the obtained results from 
     % the Simulink file
     FileSuffix = 'AllLearningExternalForces';
     TorqueFile = strcat('CorrectiveTorque',FileSuffix,'.mat');
     TorqueIndFile = strcat('CorrectiveTorque1',FileSuffix,'.mat');
     PCActivityFile = strcat('PCActivity',FileSuffix,'.mat');
     MFDCNWeightFile = strcat('MFDCNWeight',FileSuffix,'.mat');
     PCDCNWeightFile = strcat('PCDCNWeight',FileSuffix,'.mat');
     IODCNWeightFile = strcat('IODCNWeight',FileSuffix,'.mat');
     KPWeightFile = strcat('KPWeight',FileSuffix,'.mat');
     IOActivityFile = strcat('IOActivity',FileSuffix,'.mat');
     ErrorPositionFile = strcat('ErrorPosition',FileSuffix,'.mat');
     Delay=0;
     
     %Parameters for plotting the results 
     NumStep=round(TrajectoryTime/TimeStep);
     NumTrajectories=round(SimulationTime/TrajectoryTime);
    %% Robot load
     load MANIPULATORS
    %load the manipulator file with 05kg mass at the ending efector
     RRedKuKa=RRedKuKa;
     RRedKuKadet=RRedKuKadet05;
     
         %% Simulink simulation framework
     % launch the simulink file, at least the path an time per trajectory 
     % should be specified.
     open_system('CerebellumIODCNAbstractFext');
     set_param('CerebellumIODCNAbstractFext/ToFileTorque','Filename',TorqueFile);
     set_param('CerebellumIODCNAbstractFext/ToFileTorqueInd','Filename',TorqueIndFile);
     set_param('CerebellumIODCNAbstractFext/ToFilePC','Filename',PCActivityFile);
     set_param('CerebellumIODCNAbstractFext/ToFileMFDCN','Filename',MFDCNWeightFile);
     set_param('CerebellumIODCNAbstractFext/ToFilePCDCN','Filename',PCDCNWeightFile);
     set_param('CerebellumIODCNAbstractFext/Subsystem/ErrorModel/ToFileErrorPos','Filename',ErrorPositionFile);
     set_param('CerebellumIODCNAbstractFext/ToFileIO','Filename',IOActivityFile);
     set_param('CerebellumIODCNAbstractFext/ToFileKP','Filename',KPWeightFile);
     set_param('CerebellumIODCNAbstractFext/ToFileIODCN','Filename',IODCNWeightFile);
     open_system('CerebellumIODCNAbstractFext/Subsystem');
     open_system('CerebellumIODCNAbstractFext/Subsystem/ErrorModel');
     
     save_system('CerebellumIODCNAbstractFext');
     mkdir('Register');
     sim('CerebellumIODCNAbstractFext',SimulationTime+Delay);
     
     %% Plots
     Torque = load(TorqueFile);
     Torque = Torque.ans;
    % Torque Values 
     figure(1)
     subplot(3,1,1)
     title('Corrective Torque Values')
     hold on
     plot(Torque(1,:),Torque(2,:),'b')
     hold on
     plot(Torque(1,:),Torque(3,:),'r')
     hold on
     plot(Torque(1,:),Torque(4,:),'k')
     hold on
     subplot(3,1,2)
     hold on
     title('Ideal Torque Values')
     plot(Torque(1,:),Torque(8,:),'b')
     hold on
     plot(Torque(1,:),Torque(9,:),'r')
     hold on
     plot(Torque(1,:),Torque(6,:),'k')
     subplot(3,1,3)
     hold on
     title('Error Torque Values')
     plot(Torque(1,:),Torque(8,:)-Torque(2,:),'b')
     hold on
     plot(Torque(1,:),Torque(9,:)-Torque(3,:),'r')
     hold on
     plot(Torque(1,:),Torque(10,:)-Torque(4,:),'k')
     clear Torque;

      % Partial Torque Values 
     Torque1 = load(TorqueIndFile);
     Torque1 = Torque1.ans;
     figure(2)
     subplot(3,1,1)
     hold on
     title('Corrective partial Torque Values')
     hold on
     plot(Torque1(1,:),Torque1(2,:),'b')
     hold on
     plot(Torque1(1,:),Torque1(3,:),'r')
     legend('torque +q1', 'torque -q1')
     hold on
     subplot(3,1,2)
     hold on
     title('Corrective partial Torque Values')
     hold on
     plot(Torque1(1,:),Torque1(4,:),'b')
     hold on
     plot(Torque1(1,:),Torque1(5,:),'r')
     legend('torque +q2', 'torque -q2')
     hold on
     subplot(3,1,3)
     hold on
     title('Corrective partial Torque ')
     hold on
     plot(Torque1(1,:),Torque1(6,:),'b')
     hold on
     plot(Torque1(1,:),Torque1(7,:),'r')
     legend('torque +q3', 'torque -q3')
     hold on
     
     % Stiffnes     
     figure(3)
     subplot(3,1,1)
     title('Stiffness Joint 1')
     hold on
     plot(Torque1(1,:),Torque1(2,:)+Torque1(3,:),'b')
     hold on
     subplot(3,1,2)
     title('Stiffness Joint 2')
     hold on
     plot(Torque1(1,:),Torque1(4,:)+Torque1(5,:),'r')
     hold on
     subplot(3,1,3)
     title('Stiffness Joint 3')
     hold on
     plot(Torque1(1,:),Torque1(6,:)+Torque1(7,:),'k')
     hold on
     clear Torque1;
     
     % Activity at Purkinje Cells
     PCActivity = load(PCActivityFile);
     PCActivity = PCActivity.ans;
     figure(4)
     subplot(3,1,1)
     hold on
     title('PC Activity Joint 1')
     plot(PCActivity(1,:),PCActivity(2,:),'b')
     hold on
     title('PC Activity Joint 1')
     plot(PCActivity(1,:),PCActivity(3,:),'r')
     legend('+Q1', '-Q1')
     hold on
     subplot(3,1,2)
     hold on
     title('PC Activity Joint 2')
     plot(PCActivity(1,:),PCActivity(4,:),'b')
     hold on
     title('PC Activity Joint 2')
     plot(PCActivity(1,:),PCActivity(5,:),'r')
     legend('+Q2', '-Q2')
     hold on
     subplot(3,1,3)
     hold on
     title('PC Activity Joint 3')
     plot(PCActivity(1,:),PCActivity(6,:),'b')
     hold on
     title('PC Activity Joint 3')
     plot(PCActivity(1,:),PCActivity(7,:),'r')
     legend('+Q3', '-Q3')
     hold on
     clear PCActivity;
     
      % Mossy Fiber -Deep Cerebellar Nuclei synaptic weights
     MFDCNWeight = load(MFDCNWeightFile);
     MFDCNWeight = MFDCNWeight.ans;

     figure(5)
     subplot(3,1,1)
     title('MFDCN Weight Joint 1')
     hold on
     plot(MFDCNWeight(1,:),MFDCNWeight(2,:),'b')
     hold on
     title('MFDCN Weight Joint 1')
     plot(MFDCNWeight(1,:),MFDCNWeight(3,:),'r')
     legend('+Q1', '-Q1')
     hold on
     subplot(3,1,2)
     title('MFDCN Weight Joint 2')
     plot(MFDCNWeight(1,:),MFDCNWeight(4,:),'b')
     hold on
     title('MFDCN Weight Joint 2')
     plot(MFDCNWeight(1,:),MFDCNWeight(5,:),'r')
     legend('+Q2', '-Q2')
     hold on
     subplot(3,1,3)
     hold on
     title('MFDCN Weight Joint 3')
     plot(MFDCNWeight(1,:),MFDCNWeight(6,:),'b')
     hold on
     title('MFDCN Weight Joint 3')
     plot(MFDCNWeight(1,:),MFDCNWeight(7,:),'r')
     legend('+Q3', '-Q3')
     hold on
     clear MFDCNWeight;
     
     % Purkinje Cell- Deep Cerebellar Nuclei synaptic weights 
     PCDCNWeight = load(PCDCNWeightFile);
     PCDCNWeight = PCDCNWeight.ans;
     
     figure(6)
     subplot(3,1,1)
     title('PCDCN Weight Joint 1')
     hold on
     plot(PCDCNWeight(1,:),PCDCNWeight(2,:),'b')
     hold on
     title('PCDCN Weight Joint 1')
     plot(PCDCNWeight(1,:),PCDCNWeight(3,:),'r')
     legend('+Q1', '-Q1')
     hold on
     subplot(3,1,2)
     title('PCDCN Weight Joint 2')
     plot(PCDCNWeight(1,:),PCDCNWeight(4,:),'b')
     hold on
     title('PCDCN Weight Joint 2')
     plot(PCDCNWeight(1,:),PCDCNWeight(5,:),'r')
     legend('+Q2', '-Q2')
     hold on
     subplot(3,1,3)
     title('PCDCN Weight Joint 3')
     plot(PCDCNWeight(1,:),PCDCNWeight(6,:),'b')
     hold on
     title('PCDCN Weight Joint 3')
     plot(PCDCNWeight(1,:),PCDCNWeight(7,:),'r')
     legend('+Q3', '-Q3')
     hold on
     clear PCDCNWeight;
      
     % Inferior Olive -Deep Cerebellar Nuclei synaptic weights
     
     IODCNWeight = load(IODCNWeightFile);
     IODCNWeight = IODCNWeight.ans;
    
     figure(7)
     subplot(3,1,1)
     title('IODCN Weight Joint 1')
     hold on
     plot(IODCNWeight(1,:),IODCNWeight(2,:),'b')
     hold on
     title('IODCN Weight Joint 1')
     plot(IODCNWeight(1,:),IODCNWeight(3,:),'r')
     legend('+Q1', '-Q1')
     hold on
     subplot(3,1,2)
     title('IODCN Weight Joint 2')
     plot(IODCNWeight(1,:),IODCNWeight(4,:),'b')
     hold on
     title('IODCN Weight Joint 2')
     plot(IODCNWeight(1,:),IODCNWeight(5,:),'r')
     legend('+Q2', '-Q2')
     hold on
     subplot(3,1,3)
     title('IODCN Weight Joint 3')
     plot(IODCNWeight(1,:),IODCNWeight(6,:),'b')
     hold on
     title('IODCN Weight Joint 3')
     plot(IODCNWeight(1,:),IODCNWeight(7,:),'r')
     legend('+Q3', '-Q3')
     hold on
     
     
     % kp synaptic weights Evolution
     KPWeight = load(KPWeightFile);
     KPWeight = KPWeight.ans;
     
     figure(8)
     subplot(3,1,1)
     title('KP Weight Joint 1')
     hold on
     plot(KPWeight(1,:),KPWeight(2,:),'b')
     hold on
     title('KP Weight Joint 1')
     plot(KPWeight(1,:),KPWeight(3,:),'r')
     legend('+Q1', '-Q1')
     hold on
     subplot(3,1,2)
     title('KP Weight Joint 2')
     plot(KPWeight(1,:),KPWeight(4,:),'b')
     hold on
     title('KP Weight Joint 2')
     plot(KPWeight(1,:),KPWeight(5,:),'r')
     legend('+Q2', '-Q2')
     hold on
     subplot(3,1,3)
     title('KP Weight Joint 3')
     plot(KPWeight(1,:),KPWeight(6,:),'b')
     hold on
     title('KP Weight Joint 3')
     plot(KPWeight(1,:),KPWeight(7,:),'r')
     legend('+Q3', '-Q3')
     hold on
     
     % KP*Inferior Olive -Deep Cerebellar Nuclei synaptic weights
     figure(9)
     subplot(3,1,1)
     title('KP*IODCN Weight Joint 1')
     hold on
     plot(KPWeight(1,:),KPWeight(2,:).*IODCNWeight(2,:),'b')
     hold on
     title('KP*IODCN Weight Joint 1')
     plot(KPWeight(1,:),KPWeight(3,:).*IODCNWeight(3,:),'r')
     legend('+Q1', '-Q1')
     hold on
     subplot(3,1,2)
     title('KP*IODCN Weight Joint 2')
     plot(KPWeight(1,:),KPWeight(4,:).*IODCNWeight(4,:),'b')
     hold on
     title('KP*IODCN Weight Joint 2')
     plot(KPWeight(1,:),KPWeight(5,:).*IODCNWeight(5,:),'r')
     legend('+Q2', '-Q2')
     hold on
     subplot(3,1,3)
     title('KP*IODCN Weight Joint 3')
     plot(KPWeight(1,:),KPWeight(6,:).*IODCNWeight(6,:),'b')
     hold on
     title('KP*IODCN Weight Joint 3')
     plot(KPWeight(1,:),KPWeight(7,:).*IODCNWeight(7,:),'r')
    legend('+Q3', '-Q3')
     hold on
      
     clear KPWeight;
     clear IODCNWeight;
    
     % Position Error Evolution    
     ErrorPos = load(ErrorPositionFile);
     ErrorPos = ErrorPos.ans;
     
     figure(10)
     title('Position Error')
     plot(ErrorPos(1,:),ErrorPos(2,:),'b')
     hold on
     plot(ErrorPos(1,:),ErrorPos(3,:),'r')
     hold on
     plot(ErrorPos(1,:),ErrorPos(4,:),'k')
     legend('joint 1', 'joint 2','joint3')
     
     
     ErrorPos1=ErrorPos(2,:)';
     ErrorPos2=ErrorPos(3,:)';
     ErrorPos3=ErrorPos(4,:)';
     clear ErrorPos;       

     for i=1:NumTrajectories,
           Mae1(i)=mae(ErrorPos1(NumStep*(i-1)+1:(NumStep*(i))-1));
           Mae2(i)=mae(ErrorPos2(NumStep*(i-1)+1:(NumStep*(i))-1));
           Mae3(i)=mae(ErrorPos3(NumStep*(i-1)+1:(NumStep*(i))-1));
     end
      figure(11)
     subplot(3,1,1)
     title('MAE error Joint1 (Position)')
     hold on
     plot(Mae1,'b')
     hold on
     subplot(3,1,2)
     title('MAE error Joint2 (Position)')
     hold on
     plot(Mae2,'r')
     hold on
     subplot(3,1,3)
     title('MAE error Joint3 (Position)')
     hold on
     plot(Mae3,'k')
     hold on
    
     save_system('CerebellumIODCNAbstractFext');
     close_system('CerebellumIODCNAbstractFext');